Little Elephant and Array - CodeForces 220 B 树状数组
来源:互联网 发布:博物君的淘宝店 编辑:程序博客网 时间:2024/06/04 19:17
题意:在一个序列中,从l到r的x数中出现的次数正好是x次的情况有多少。
思路:离线做,先处理要求的区间,按r递增排序,然后每次处理序列中的一个数的时候,找出+1所在的区间,并将之前的区间-1恢复,用差分的方式处理树状数组。
AC代码如下:
#include<cstdio>#include<cstring>#include<map>#include<vector>#include<algorithm>using namespace std;map<int,int> match;int tree[100010],n,m,num,ans[100010],val[100010],f[100010],p[100010];vector<int> vc[100010];struct node{ int l,r,pos;}op[100010];bool cmp(node a,node b){ return a.r<b.r;}int lowbit(int x){ return x&(-x);}void update(int x,int val){ for(;x<=n;x+=lowbit(x)) tree[x]+=val;}int query(int x){ int ret=0; for(;x>0;x-=lowbit(x)) ret+=tree[x]; return ret;}int main(){ int i,j,k,pos; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&val[i]); f[i]=val[i]; } sort(f+1,f+1+n); for(i=1;i<=n;i++) if(f[i]!=f[i-1]) { num++; match[f[i]]=num; } for(i=1;i<=m;i++) { scanf("%d%d",&op[i].l,&op[i].r); op[i].pos=i; } for(i=1;i<=num;i++) vc[i].push_back(0); sort(op+1,op+1+m,cmp); op[m+1].r=0; pos=1; for(i=1;i<=n;i++) { k=match[val[i]]; p[k]++; vc[k].push_back(i); if(p[k]>=val[i]) { update(vc[k][p[k]-val[i]]+1,1); update(vc[k][p[k]-val[i]+1]+1,-1); if(p[k]>val[i]) { update(vc[k][p[k]-val[i]-1]+1,-1); update(vc[k][p[k]-val[i]]+1,1); } } while(op[pos].r==i) { ans[op[pos].pos]=query(op[pos].l); pos++; } } for(i=1;i<=m;i++) printf("%d\n",ans[i]);}
0 0
- Codeforces 220B - Little Elephant and Array 离线树状数组
- Little Elephant and Array - CodeForces 220 B 树状数组
- Codeforces 220B Little Elephant and Array
- CodeForces 220B Little Elephant and Array
- CodeForces Round #136(220B) - Little Elephant and Array
- 线段树 CodeForces 220B - Little Elephant and Array
- Codeforces 220B(Little Elephant and Array)
- CodeForces 220B Little Elephant and Array 莫队算法
- CF 220B Little Elephant and Array
- Codeforces Round #136 (Div. 1) B. Little Elephant and Array
- Codeforces Round #136 (Div. 1) B. Little Elephant and Array
- codeforces 221D Little Elephant and Array
- codeforces 221D Little Elephant and Array
- CodeForces 204B - Little Elephant and Cards
- codeforces 204B- Little Elephant and Cards
- codeforces 221B Little Elephant and Numbers
- Codeforces-258B Little Elephant and Elections
- Codeforces 258B Little Elephant and Elections
- 动画类型 Android的animation由四种类型组成
- String的split()方法探索和大揭秘
- stl_stack.h
- 用 STC12C5A60S2 产生PWM波
- stl_queue.h
- Little Elephant and Array - CodeForces 220 B 树状数组
- on_exit()函数使用说明
- 司的法规司的法规司的法规
- stl_slist.h
- Android_ArrayAdapter文字排列_141002
- 将a和b交换的3种方法
- NYOJ 题目291 LK的数学题(欧拉函数)
- stl_heap.h
- Alternative Scale of Notation(大数java)