HDU 4217 Data Structure?(线段树版)
线段树 不熟啊。。。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 262145 __int64 sum; struct node { int l; int r; __int64 v; }p[4*N]; void push(int rt) { p[rt].v = p[rt<<1].v+p[rt<<1|1].v; } void build(int l,int r,int rt) { int m; p[rt].l = l; p[rt].r = r; if(l == r) { p[rt].v = 1; return ; } m = (l + r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); push(rt); } void update(int pos,int l,int r,int rt) { int m; if(l == r) { sum += l; p[rt].v = 0; return ; } m = (l +r)>>1; if(pos > p[rt<<1].v) { update(pos-p[rt<<1].v,m+1,r,rt<<1|1); } else { update(pos,l,m,rt<<1); } push(rt); } int main() { int i,n,m,t,num = 0,s; scanf("%d",&t); while(t--) { memset(p,0,sizeof(p)); num ++; sum = 0; scanf("%d",&n); build(1,n,1); scanf("%d",&m); for(i = 1;i <= m;i ++) { scanf("%d",&s); update(s,1,n,1); } printf("Case %d: %I64d\n",num,sum); } return 0; }