由于近日一个人呆机房较多,没什么人陪我聊天,一些无聊的话全写博客里了,见谅。
【题目描述】
假设有一列数 {Ai }(1 ≤ i ≤ n) ,支持如下两种操作:
(1)将 A k 的值加 D 。( k, D 是输入的数)
(2) 输出 A s +A s+1 +…+A t 。( s, t 都是输入的数, S ≤ T )
根据操作要求进行正确操作并输出结果。
【输入格式】
输入文件第一行一个整数 n(0<=n<=100000) ;
第二行为 n 个整数,表示 {A i } 的初始值。
第三行为一个整数 m(0<=m<=150000) ,表示操作数。 下接 m 行,每行描述一个操作,有如下两种情况:
ADD k d ( 表示将 A k 加 d , 1<=k<=n , d 为整数 )
SUM s t (表示输出 A s +…+A t )
【题解大意】
其实说白了是道不准用数据结构水的cdq模板。
【调试中途】
问题:没有输出!
可能的原因:
1.莫不是输入的数据有问题 -> 没有问题
2.莫不是两个变量的记录有问题 ->没有问题
输出每次cdq的左右区间,发现它一直递归到小的区间之后就没有然后了不会递归回去。
3.莫不是cdq的开闭区间有问题 ->将闭区间改成开区间->递归到较小区间后会递归回来了->样例可以输出->依然错误
4.改变变量的起始值,改变区间开闭之后的隐患->发现有的时候是对的有时候错了?->蜜汁错误
5.真的不知道哪里错了啊啊啊啊啊->忍不住爆了一句粗口发现机房好像除了我还有一个女老师
->摊在椅背上绝望了一会儿->持续打表->发现输入数据的处理果然是有问题的->知道问题啦好嗨森
6.改了十分钟计数的变量->调出来啦啦啦
【code】

#include<bits/stdc++.h> using namespace std; #define File "shulie" #define ll long long inline void file(){ freopen(File".in","r",stdin); freopen(File".out","w",stdout); } const int mxn = 5e5+5; int n,M; struct T{ int k,id; ll v; friend bool operator <(T x,T y){ return x.id==y.id ? x.k<y.k : x.id<y.id; } }t[mxn],p[mxn]; int ans[mxn]; int d = 0; inline void cdq(int l,int r){ if(r-l<=1) return; int mid = (l+r) >>1; cdq(l,mid),cdq(mid,r); int ret = 0; int i = l,j = mid,k = 0; while(i<mid && j<r){ if(t[i] < t[j]){ if(t[i].k == 1) ret += t[i].v; p[k] = t[i],++k,++i; }else{ if(t[j].k == 2) ans[t[j].v] -= ret; if(t[j].k == 3) ans[t[j].v] += ret; p[k] = t[j],++k,++j; } } while(i<mid) p[k] = t[i],++k,++i; while(j<r){ if(t[j].k == 2) ans[t[j].v] -= ret; if(t[j].k == 3) ans[t[j].v] += ret; p[k] = t[j],++k,++j; } for(int i = 0;i < k; ++i) t[i+l] = p[i]; } int tot(0); int main(){ file(); scanf("%d",&n); for(int i = 1;i <= n; ++i){ t[tot].id = i,t[tot].k = 1; scanf("%lld",&t[tot].v); ++tot; } scanf("%d",&M); for(int i = 1;i <= M; ++i){ char s[5]; scanf("%s",s); if(s[0]=='A'){ t[tot].k = 1; scanf("%d %lld",&t[tot].id,&t[tot].v); }else{ int l,r; scanf("%d %d",&l,&r); ++d; t[tot].k = 2,t[tot].id = l-1,t[tot].v = d; t[++tot].k = 3,t[tot].id = r,t[tot].v = d; } ++tot; } cdq(0,tot); for(int i = 1;i <= d; ++i) printf("%d ",ans[i]); return 0; } /* 4 1 4 2 3 3 SUM 1 3 ADD 2 50 SUM 2 3 */