codeforces 702F 可持久化平衡树
2016-08-19 16:26
387 查看
题意:有n种T恤,每种有一个价格ci和品质qi。有m个人要买T恤,第i个人有vi块钱,每个人每次都买一件能买得起的qi最大的T恤。一个人只能买一种T恤一件,所有人互不影响。求最后每个人买了多少件T恤。
将T恤排序。用可持久化平衡树维护所有人。扫一遍T恤,将钱数大于当前T恤价值的人拿出来,把他们的钱数减当前价格,再塞回去。
当减完价格后这个集合的最小元素不一定大于另一个集合的最大元素。这样就不能merge。
不过由于当前集合中减完价格后的值小于价格的人的钱数一定至少减半,所以每个人只能有log次减完价格后的值小于价格。因此可以暴力将这些人插入。复杂度log^2
将T恤排序。用可持久化平衡树维护所有人。扫一遍T恤,将钱数大于当前T恤价值的人拿出来,把他们的钱数减当前价格,再塞回去。
当减完价格后这个集合的最小元素不一定大于另一个集合的最大元素。这样就不能merge。
不过由于当前集合中减完价格后的值小于价格的人的钱数一定至少减半,所以每个人只能有log次减完价格后的值小于价格。因此可以暴力将这些人插入。复杂度log^2
#include <bits/stdc++.h> using namespace std; #define N 210000 #define ls ch[x][0] #define rs ch[x][1] int n,m,root; pair<int,int>a ; int val ,ch [2],bv ,bc ,rnd ,cnt ; void pushdown(int x) { if(!x)return; if(bv[x]) { val[ls]+=bv[x];val[rs]+=bv[x]; bv[ls]+=bv[x];bv[rs]+=bv[x]; bv[x]=0; } if(bc[x]) { cnt[ls]+=bc[x];cnt[rs]+=bc[x]; bc[ls]+=bc[x];bc[rs]+=bc[x]; bc[x]=0; } } void split(int rt,int &x,int &y,int v) { if(!rt){x=y=0;return;} pushdown(rt); if(val[rt]<v) x=rt,split(ch[rt][1],ch[x][1],y,v); else y=rt,split(ch[rt][0],x,ch[y][0],v); } int merge(int x,int y) { if(!x||!y)return x+y; if(rnd[x]<rnd[y]) { pushdown(x); ch[x][1]=merge(ch[x][1],y); return x; } else { pushdown(y); ch[y][0]=merge(x,ch[y][0]); return y; } } int insert(int x,int y) { int r1=0,r2=0; split(x,r1,r2,val[y]); r1=merge(r1,y); x=merge(r1,r2); return x; } int dfs(int x,int y) { if(!x)return y; pushdown(x); y=dfs(ls,y); y=dfs(rs,y); ch[x][0]=ch[x][1]=0; return insert(y,x); } void down(int x) { if(!x)return; pushdown(x); down(ls);down(rs); } int main() { // freopen("tt.in","r",stdin); scanf("%d",&n); for(int i=1,c,q;i<=n;i++) { scanf("%d%d",&c,&q); a[i]=make_pair(-q,c); } sort(a+1,a+1+n); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%d",&val[i]); rnd[i]=rand(); root=insert(root,i); } for(int i=1;i<=n;i++) { int c=a[i].second; int r1=0,r2=0,r3=0,r4=0; split(root,r1,r2,c); val[r2]-=c;bv[r2]-=c; cnt[r2]++;bc[r2]++; split(r2,r3,r4,c-1); r1=dfs(r3,r1); root=merge(r1,r4); } down(root); for(int i=1;i<=m;i++) printf("%d ",cnt[i]); return 0; }
相关文章推荐
- UVA 12538 Version Controlled IDE 可持久化平衡树 || rope
- [DP 平衡树] Codeforces 809D Round #415 (Div. 1) D. Hitchhiking in the Baltic States
- codeforces 484E Sign on Fence 可持久化线段树+二分查找
- 【codeforces】484E. Sign on Fence 可持久化线段树
- [luogu3835]可持久化平衡树
- Rope大法(可持久化平衡树)
- codeforces840D Destiny -- 可持久化线段树
- Codeforces 809D [平衡树][动态规划]
- BZOJ3932 CQOI2015 任务查询系统-可持久化线段树-可持久化平衡树
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
- 【Rope大法好】【STL中丧心病狂的可持久化平衡树】
- Codeforces 702F T-shirt 可持久化Treap练手
- [均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence
- 【可持久化平衡树】Version Controlled IDE
- [模板] fhqTreap (非旋Treap)+ 可持久化平衡树
- Codeforces 706D Vasiliy's Multiset(可持久化字典树)
- 洛谷P3835 【模板】可持久化平衡树
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
- [Luogu 3835]【模板】可持久化平衡树
- [您有新的未分配科技点]可,可,可持久化!?------可持久化平衡树普及版讲解