题目连接: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 ",ans1[i]); 97 } 98 return 0; 99 }