标签:
题目链接:
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
/* 树状数组的代码: 4417 202MS 3744K 1873 B G++ 2014300227 */ #include <bits/stdc++.h> using namespace std; const int N=1e5+4; int a[N],n,m,sum[N],ans[N]; struct node { friend bool operator< (node x,node y) { if(x.num == y.num)return x.pos < y.pos; return x.num < y.num; } int l,r,pos,num; }; node po[N]; struct nod { friend bool operator< (nod x,nod y) { if(x.a==y.a)return x.pos<y.pos; return x.a<y.a; } int a,pos; }; nod p[N]; int lowbit(int x) { return x&(-x); } void update(int x) { while(x<=n) { sum[x]++; x+=lowbit(x); } } int query(int x) { int s=0; while(x>0) { s+=sum[x]; x-=lowbit(x); } return s; } int main() { int t; scanf("%d",&t); int cnt=1; while(t--) { memset(sum,0,sizeof(sum)); printf("Case %d:\n",cnt++); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&p[i].a); p[i].pos=i; } sort(p+1,p+n+1); for(int i=0;i<m;i++) { scanf("%d%d%d",&po[i].l,&po[i].r,&po[i].num); po[i].l++; po[i].r++; po[i].pos=i; } sort(po,po+m); int fp=1; for(int i=0;i<m;i++) { if(p[fp].a<=po[i].num) { while(p[fp].a<=po[i].num&&fp<=n) { update(p[fp].pos); fp++; } } if(po[i].l==1)ans[po[i].pos]=query(po[i].r); else { ans[po[i].pos]=query(po[i].r)-query(po[i].l-1); } } for(int i=0;i<m;i++) { printf("%d\n",ans[i]); } } return 0; }
hdu-4417 Super Mario(树状数组 + 划分树)
标签:
原文地址:http://www.cnblogs.com/zhangchengc919/p/5357496.html