BZOJ2006【主席树】【优先队列】
2015-03-31 23:07
309 查看
对于用RMQ写这道题的菊苣们无限仰慕.
/* I will wait for you */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<iostream> #include<fstream> #include<vector> #include<queue> #include<deque> #include<set> #include<map> #include<string> typedef long long LL; typedef unsigned long long ULL; using namespace std; const int maxn=100010; const int maxm=500000010; const int maxs=26; const int INF=1<<29; const int P=1000000007; const double error=1e-9; struct node { int l,r,sum;node *son[2]; node(int x,int y) { l=x;r=y;sum=0;son[0]=son[1]=0; } }*su[maxn]; struct ans{ int key,id,k; }; int n,k,L,R,c[maxn],ml[maxn],mr[maxn]; bool operator < (ans a,ans b) { return a.key<b.key; } priority_queue<ans> q; void maintain(node* o) { o->sum=0; for(int i=0;i<2;i++) if(o->son[i]) o->sum+=o->son[i]->sum; } node* insert(node* o,int c,int x,int y) { node* p=new node(x,y); if(x==y) p->sum=o?o->sum+1:1; else { int mid=x+(y-x)/2; node *ls=o?o->son[0]:0,*rs=o?o->son[1]:0; if(c<=mid) p->son[0]=insert(ls,c,x,mid),p->son[1]=rs; if(c>mid) p->son[1]=insert(rs,c,mid+1,y),p->son[0]=ls; maintain(p); } return p; } int rank(node* x,node* y,int l,int r,int k) { if(l==r) return (l+r)/2; int mid=l+(r-l)/2; int xs=x&&x->son[0]?x->son[0]->sum:0; int ys=y&&y->son[0]?y->son[0]->sum:0; int d=(k>ys-xs); node *sx=x?x->son[d]:0,*sy=y?y->son[d]:0; if(k<=ys-xs) return rank(sx,sy,l,mid,k); else return rank(sx,sy,mid+1,r,k-(ys-xs)); } int kth(int l,int r,int k) { return rank(su[l-1],su[r],-maxm,maxm,k); } int main() { scanf("%d%d%d%d",&n,&k,&L,&R); su[0]=insert(su[0],0,-maxm,maxm); for(int i=1;i<=n;i++) { scanf("%d",&c[i]);c[i]+=c[i-1]; su[i]=insert(su[i-1],c[i],-maxm,maxm); ml[i]=max(0,i-R);mr[i]=max(0,i-L); if(i>=L) q.push((ans){c[i]-kth(ml[i],mr[i],1),i,1}); } LL fin=0; for(int i=1;i<=k;i++) { ans p=q.top();q.pop();fin+=p.key; if(p.k<=mr[p.id]-ml[p.id]) q.push((ans){c[p.id]-kth(ml[p.id],mr[p.id],p.k+1),p.id,p.k+1}); } printf("%lld\n",fin); return 0; }
相关文章推荐
- bzoj2006 [NOI2010]超级钢琴 [优先队列|RMQ]
- BZOJ 2006 && NOI 2010 [优先队列]
- 【bzoj1727】[Usaco2006 Open]The Milk Queue 挤奶队列 贪心
- bzoj1727 [Usaco2006 Open]The Milk Queue 挤奶队列 贪心
- [BZOJ3523][[Poi2014]Bricks][贪心+优先队列]
- BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)
- BZOJ1727: [Usaco2006 Open]The Milk Queue 挤奶队列
- BZOJ1727: [Usaco2006 Open]The Milk Queue 挤奶队列
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
- [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]
- BZOJ 1727 [Usaco2006 Open]The Milk Queue 挤奶队列
- BZOJ1095【动态点分治】【优先队列】
- bzoj2006 [NOI2010]超级钢琴 堆+ST表/主席树
- BZOJ 1514 _ [POI2006]ZAB-Frogs 单调队列+二分BFS
- BZOJ 2006 NOI 2010 超级钢琴 堆+主席树
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
- 【BZOJ2006】【NOI2010】超级钢琴 Heap+主席树
- [BZOJ]1071: [SCOI2007]组队 STL优先队列
- bzoj4504: K个串【主席树区间操作+优先队列】
- BZOJ 2006 [NOI2010]超级钢琴 主席树+堆