HDOJ 5213

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213
BC 上的题,题解很清楚,会莫对的应该不难,
对于一个询问,我们拆成四个询问,开始拆成求区间矩形的样子,我想多了。
然后就是模板的莫队了。
一个变量打错,一直DEBUG  
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<string>
 6 #include<iostream>
 7 using namespace std;
 8 
 9 #define N 600055
10 typedef long long LL;
11 int a[N],pos[N],block;
12 int n,m,k,idx;
13 int ans1[N],tmp[N];
14 
15 struct node
16 {
17     int l,r,id;
18     int p;
19 }q[N];
20 
21 //BZOJ 4129
22 int cmp(node a,node b)
23 {
24     if (pos[a.l]==pos[b.l]) return a.r<b.r;
25     return pos[a.l]<pos[b.l];
26 }
27 
28 void solve()
29 {
30     int l=1,r=0;
31     int ans=0;
32     for (int i=1;i<=m;i++)
33     {
34         while (l>q[i].l)
35         {
36             l--;
37             if (k-a[l]>0) ans+=tmp[k-a[l]];
38             tmp[a[l]]++;
39         }
40         while (r<q[i].r)
41         {
42             r++;
43             if (k-a[r]>0) ans+=tmp[k-a[r]];
44             tmp[a[r]]++;
45         }
46         while (l<q[i].l)
47         {
48             if (k-a[l]>0) ans-=tmp[k-a[l]];
49             tmp[a[l]]--;
50             l++;
51         }
52         while (r>q[i].r)
53         {
54             if (k-a[r]>0) ans-=tmp[k-a[r]];
55             tmp[a[r]]--;
56             r--;
57         }
58         ans1[q[i].id]+=q[i].p*ans;
59     }
60 }
61 
62 int main()
63 {
64  while (scanf("%d%d",&n,&k)!=EOF)
65  {
66     memset(ans1,0,sizeof(ans1));
67     for (int i=1;i<=n;i++)
68     scanf("%d",&a[i]);
69     memset(tmp,0,sizeof(tmp));
70 
71     block=sqrt(n);
72     for (int i=1;i<=n;i++)
73     pos[i]=(i-1)/block+1;
74     idx=0;
75     scanf("%d",&m);
76 
77     for (int i=1;i<=m;i++)
78     {
79       int l,r,l2,r2;
80       scanf("%d%d%d%d",&l,&r,&l2,&r2);
81       q[++idx].l=l;q[idx].r=r2;q[idx].id=i;q[idx].p=1;
82       if (r+1<=l2-1)
83       {
84           q[++idx].l=r+1,q[idx].r=l2-1,q[idx].id=i,q[idx].p=1;
85       }
86       q[++idx].l=l;q[idx].r=l2-1;q[idx].id=i,q[idx].p=-1;
87       q[++idx].l=r+1;q[idx].r=r2;q[idx].id=i,q[idx].p=-1;
88     }
89     swap(idx,m);
90     sort(q+1,q+m+1,cmp);
91     //for (int i=1;i<=m;i++) cout<<q[i].id<<" ";
92    //cout<<endl;
93    // cout<<m<<" "<<idx<<endl;
94     solve();
95     for (int i=1;i<=idx;i++)
96     printf("%d\n",ans1[i]);
97     }
98     return 0;
99 }

 

posted on 2015-09-06 16:33  forgot93  阅读(211)  评论(0编辑  收藏  举报

导航