洛谷 4743 Energy Center 发表于 2018.12.15 | 分类于 题解 | 14 被题意杀了,也许是语文不好…… 平衡树维护序列,每个结点上记录每一种属性的值和子树和就好惹。 代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#include <cstdio>#include <cstdlib>#define ls(p) tree[p].lson#define rs(p) tree[p].rsonusing namespace std;const int N = 1e4;const int Q = 1e4;const int M = 200;int n,m,q;int p;struct node{ int val[M + 5],sum[M + 5]; int rnd,sz; int lson,rson;} tree[N + Q + 10];inline void up(int p){ tree[p].sz = tree[ls(p)].sz + 1 + tree[rs(p)].sz; for(register int i = 0;i < m;++i) tree[p].sum[i] = tree[ls(p)].sum[i] + tree[p].val[i] + tree[rs(p)].sum[i];}void split(int p,int k,int &x,int &y){ if(!p) { x = y = 0; return ; } if(tree[ls(p)].sz < k) x = p,split(rs(p),k - tree[ls(p)].sz - 1,rs(p),y); else y = p,split(ls(p),k,x,ls(p)); up(p);}int merge(int x,int y){ if(!x || !y) return x | y; if(tree[x].rnd < tree[y].rnd) { rs(x) = merge(rs(x),y); up(x); return x; } else { ls(y) = merge(x,ls(y)); up(y); return y; }}int main(){ srand(19260817); scanf("%d%d",&n,&m); for(register int i = 1;i <= n;++i) { int k,x,y; scanf("%d",&k); for(register int j = 1;j <= k;++j) scanf("%d%d",&x,&y),tree[i].val[x] = tree[i].sum[x] = y; tree[i].rnd = rand(),tree[i].sz = 1; p = merge(p,i); } scanf("%d",&q); char op[5]; int l,r; int x,y,z; while(q--) { scanf("%s",op); if(op[0] == 'I') { int k; scanf("%d%d",&l,&k); ++n; for(register int i = 1;i <= k;++i) scanf("%d%d",&x,&y),tree[n].val[x] = tree[n].sum[x] = y; tree[n].rnd = rand(),tree[n].sz = 1; split(p,l,x,y); p = merge(merge(x,n),y); } else if(op[0] == 'D') { scanf("%d",&l); split(p,l,x,z); split(x,l - 1,x,y); p = merge(x,z); } else if(op[1] == 'A') printf("%d\n",tree[p].sz); else { scanf("%d%d",&l,&r); split(p,r,x,z); split(x,l - 1,x,y); for(register int i = 0;i < m;++i) printf("%d ",tree[y].sum[i]); puts(""); p = merge(merge(x,y),z); } } puts("end");} 本文作者: Alpha1022 本文链接: https://www.alpha1022.me/articles/lg-4743.htm 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!