POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)
2016-02-25 20:54
417 查看
思路:线段树的区间add和区间查询模板
Description
给出了一个序列,你需要处理如下两种询问。
"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
"Q a b" 询问[a, b]区间中所有值的和。
Input
第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.
第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。
接下来Q行询问,格式如题目描述。
Output
对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。
Sample Input
Sample Output
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define LL long long #define lson i*2,l,m #define rson i*2+1,m+1,r const int maxn = 100000+100; LL sum[maxn*4]; LL addv[maxn*4]; void PushDown(int i,int num) { if (addv[i]) { sum[i*2] +=addv[i]*(num-(num/2)); sum[i*2+1]+= addv[i]*(num/2); addv[i*2] +=addv[i]; addv[i*2+1]+=addv[i]; addv[i]=0; } } void PushUp(int i) { sum[i] = sum[i*2]+sum[i*2+1]; } void build(int i,int l,int r) { addv[i]=0; if (l==r) { scanf("%lld",&sum[i]); return; } int m = (l+r)/2; build(lson); build(rson); PushUp(i); } void update(int ql,int qr,int add,int i,int l,int r) { if (ql<=l && qr>=r) { addv[i]+=add; sum[i]+=(LL)add*(r-l+1); return; } PushDown(i,r-l+1); int m = (l+r)/2; if (ql <=m) update(ql,qr,add,lson); if (qr > m) update(ql,qr,add,rson); PushUp(i); } LL query(int ql,int qr,int i,int l,int r) { if (ql<=l && r<=qr) { return sum[i]; } PushDown(i,r-l+1); int m = (l+r)/2; LL ans = 0; if (ql <=m) ans +=query(ql,qr,lson); if (m<qr) ans+=query(ql,qr,rson); return ans; } int main() { int n,q; while (scanf("%d%d",&n,&q)!=EOF && n&&q) { build(1,1,n); while (q--) { char str[10]; scanf("%s",str); int x,y,z; if (str[0] =='Q') { scanf("%d%d",&x,&y); printf("%lld\n",query(x,y,1,1,n)); } else { scanf("%d%d%d",&x,&y,&z); update(x,y,z,1,1,n); } } } }
Description
给出了一个序列,你需要处理如下两种询问。
"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
"Q a b" 询问[a, b]区间中所有值的和。
Input
第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.
第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。
接下来Q行询问,格式如题目描述。
Output
对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。
Sample Input
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
Sample Output
4 55 9 15
相关文章推荐
- Unity5.3 不改变原代码,将ModifyVertices换成ModifyMesh的一个方法
- MKMapView的使用
- 利用ItextPdf、core-renderer-R8 来生成PDF
- 循环语句
- Android开发中的SQLite事务处理
- 哈理工OJ 2161 数列(数学题目)
- XAPP的使用
- android中MVP的理解和实例
- laravel+php+微信扫码支付
- djasflkea
- bzoj2393: Cirno的完美算数教室
- (一)Data Science Specialization学习笔记
- Rar Java Zip
- [BZOJ3239][poj2417]Discrete Logging(BSGS算法)
- 找出字符串中第一个只出现一次的字符
- 网页div转换成图片导出——html2canvas
- Tomcat中文乱码处理:URIEncoding,useBodyEncodingForURI
- JAVA_多态性演示a____自动向上转型、向下转型、检查对象是否为某个类型(instanceof)
- 【OFDM入门篇 未完】LTE轻松进阶【学习总结】
- JAVA_多态性演示a____自动向上转型、向下转型、检查对象是否为某个类型(instanceof)