求dalao找错。。实在找不出来了。。 8WA 2TLE

P2042 [NOI2005] 维护数列

```cpp inline int pre() { pushdown(rt); if(son[rt][0] == 0) return -1; int now = son[rt][0]; while(son[now][1] != 0) now = son[now][1], pushdown(now); return now; } inline int suf() { pushdown(rt); if(son[rt][1] == 0) return -1; int now = son[rt][1]; while(son[now][0] != 0) now = son[now][0], pushdown(now); return now; } inline int select(int loc) { int now = rt; while(true) { pushdown(now); if(size[son[now][0]] + 1 == loc) return now; if(size[son[now][0]] + 1 > loc) now = son[now][0]; else { loc = loc - size[son[now][0]] - 1; now = son[now][1]; } } } inline void insert(int loc, int cnt) { splay(select(loc), 0); int tmpsuf = suf(); if(tmpsuf == -1) { build(son[rt][1], 1, cnt, rt); pushup(rt); return ; } splay(tmpsuf, rt); build(son[tmpsuf][0], 1, cnt, tmpsuf); pushup(tmpsuf); pushup(rt); } inline void del(int loc, int cnt) { int now = get_loc(loc, loc+cnt-1); int p = fa[now], which = get(now); clear_tree(now); son[p][which] = 0; pushup(p); pushup(rt); } inline void make_same(int loc, int cnt, int x) { int now = get_loc(loc, loc+cnt-1); optc[now] = x; sum[now] = size[now] * x; key[now] = x; lmax[now] = rmax[now] = nowmax[now] = (x > 0) ? x * size[x] : 0; pushdown(now); } inline void rever(int loc, int cnt) { int now = get_loc(loc, loc+cnt-1); optr[now] ^= 1; pushdown(now); } inline int get_sum(int loc, int cnt) { int now = get_loc(loc, loc+cnt-1); return sum[now]; } inline int max_sum() { return nowmax[rt]; } inline void output(int o) { if(o == rt) pop = 0; printf("now:%d, lson:%d, rson:%d\n", key[o], key[son[o][0]], key[son[o][1]]); if(son[o][0] != 0) output(son[o][0]); op[++pop] = key[o]; if(son[o][1] != 0) output(son[o][1]); if(o == rt) { for(int i=1; i<=pop; i++) printf("%d ", op[i]); printf("\n"); } } inline void clear_tree(int o) { if(son[o][0] != 0) clear_tree(son[o][0]); if(son[o][1] != 0) clear_tree(son[o][1]); clear_node(o); } } st; int main() { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) scanf("%d", &a[i]); st.clear(); st.build(st.rt, 1, n, 0); st.pushup(st.rt); for(int i=1; i<=m; i++) { /*printf("rt:%d\n", st.rt); st.output(st.rt); printf("\n");*/ /*for(int i=1; i<=n*2; i++) printf("%d ", st.key[i]); printf("key\n"); for(int i=1; i<=n*2; i++) printf("%d ", st.son[i][0]); printf("lson\n"); for(int i=1; i<=n*2; i++) printf("%d ", st.son[i][1]); printf("rson\n"); for(int i=1; i<=n*2; i++) printf("%d ", st.size[i]); printf("size\n"); for(int i=1; i<=n*2; i++) printf("%d ", st.sum[i]); printf("sum\n"); for(int i=1; i<=n*2; i++) printf("%d ", st.nowmax[i]); printf("nowmax\n\n");*/ string str; int tmp1, tmp2; cin>> str; if(str[0] == 'G') { scanf("%d%d", &tmp1, &tmp2); if(tmp2 == 0) { printf("0\n"); continue; } printf("%d\n", st.get_sum(tmp1, tmp2)); } if(str[0] == 'M' && str[2] == 'X') printf("%d\n", st.max_sum()); if(str[0] == 'I') { scanf("%d%d", &tmp1, &tmp2); if(tmp2 == 0) continue; for(int j=1; j<=tmp2; j++) scanf("%d", &a[j]); st.insert(tmp1, tmp2); } if(str[0] == 'D') { scanf("%d%d", &tmp1, &tmp2); if(tmp2 == 0) continue; st.del(tmp1, tmp2); } if(str[0] == 'M' && str[2] == 'K') { int tmp3; scanf("%d%d%d", &tmp1, &tmp2, &tmp3); if(tmp2 == 0) continue; st.make_same(tmp1, tmp2, tmp3); } if(str[0] == 'R') { scanf("%d%d", &tmp1, &tmp2); if(tmp2 == 0) continue; st.rever(tmp1, tmp2); } } return 0; } ```
by 魔塔哈奇 @ 2017-11-17 11:49:04


建议你这样查错: 找一份接口与你的代码相似的AC代码,把这份代码的各个部分分别“移植”到你的代码里,或是把你的部分代码移植到AC代码中,多提交几次并比对结果,这样可以比较有效的找出错因。 我在做这题的时候各种不明所以的RE,后来就是用这方法找到了错因。。。 希望对你有帮助~
by Running_Coder @ 2017-11-17 12:24:16


|