P3374 【模板】树状数组 我的代码为什么0分,错在哪?

P3374 【模板】树状数组 1

@[LiM\_817](/space/show?uid=56724) 干嘛又@我
by applese @ 2017-12-17 21:17:57


@[啦啦啦666](/space/show?uid=48417) @[LiM\_817](/space/show?uid=56724) 显然完全可以用线段树的模板水过本题: ```cpp #include <cstdio> #include <cstring> struct node{ int l,r,lc,rc,c; } a[1000001]; int q[1000001],len=0,n=0,m=0; void bt(int l,int r) { len++; a[len].l=l; a[len].r=r; a[len].lc=-1; a[len].rc=-1; a[len].c=0; int now=len; if(l<r) { int mid=(l+r)/2; a[len].lc=len+1,bt(l,mid); a[now].rc=len+1,bt(mid+1,r); } } void change(int now,int x,int t) { if(a[now].l==a[now].r) { a[now].c+=t; return ; } int mid=(a[now].l+a[now].r)/2; if(x<=mid) { change(a[now].lc,x,t); } else { change(a[now].rc,x,t); } a[now].c=a[a[now].lc].c+a[a[now].rc].c; } int findsum(int now,int l,int r) { if(a[now].l==l && a[now].r==r) { return a[now].c; } int mid=(a[now].l+a[now].r)/2; if(r<=mid) { return findsum(a[now].lc,l,r); } else if(mid+1<=l) { return findsum(a[now].rc,l,r); } else { return findsum(a[now].lc,l,mid)+findsum(a[now].rc,mid+1,r); } } int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&q[i]); } bt(1,n); for(int i=1;i<=n;i++) { change(1,i,q[i]); } for(int i=1;i<=m;i++) { int t=0,x=0,y=0; scanf("%d %d %d",&t,&x,&y); if(t==1) { change(1,x,y); } else { printf("%d\n",findsum(1,x,y)); } } return 0; } ```
by Drinkkk @ 2017-12-17 21:18:54


这™不是线段树吗
by λᴉʍ @ 2017-12-17 21:21:47


树状数组不是有Lowbit吗=\_=???,这个怎么没有。
by Loner_Knowledge @ 2017-12-17 22:56:58


@[Loner\_Knowledge](/space/show?uid=78044) 其实楼主想说的是如何用线段树水过本题。
by Drinkkk @ 2017-12-18 07:56:55


这个线段树。。。好魔性
by Lolierl @ 2017-12-18 18:35:27


@[Lolierl](/space/show?uid=22930) 原谅我花了1分钟都没看明白这个线段树......
by 权御天下 @ 2017-12-19 22:27:41


@钟梓俊,你怎么让我理解这代码?
by 一个低调的人 @ 2017-12-20 19:09:24


才发现这段代码是线段树。。。
by iodwad @ 2017-12-20 19:09:59


您怎么能用线段树水splay好题呢
by newbie314159 @ 2017-12-20 19:15:42


上一页 | 下一页