poj3468
来源:互联网 发布:淘宝客网站开发 编辑:程序博客网 时间:2024/05/30 22:54
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.
You need to answer all Q commands in order. One answer in a line.
10 51 2 3 4 5 6 7 8 9 10Q 4 4Q 1 10Q 2 4C 3 6 3Q 2 4
455915
AC代码:
#include<iostream>#include<algorithm>#include<stdio.h>#include<cstdio>#include<string.h>#include<cstring>#include<queue>#include<vector>#include<cmath>#include<stack>#include<set>#include<map>#define lson l,mid,ro<<1#define rson mid+1,r,ro<<1|1using namespace std;const int N=1e5+10;const int mod=9973;typedef long long ll;struct node{ int l,r; ll sum; ll val;}tr[N*4];ll a[N];void build(int l,int r,int ro){ tr[ro].l=l; tr[ro].r=r; tr[ro].val=0; if(l==r) { tr[ro].sum=a[l]; return ; } int mid=(l+r)/2; build(lson); build(rson); tr[ro].sum=tr[ro<<1].sum+tr[ro<<1|1].sum;}void add(int a,int b,int ro,ll val){ if(a<=tr[ro].l&&b>=tr[ro].r) { tr[ro].val+=val; return ; } else if(a>=tr[ro].l&&b<=tr[ro].r) { tr[ro].sum+=(b-a+1)*val; } else if(a<=tr[ro].l&&b<=tr[ro].r) { tr[ro].sum+=(b-tr[ro].l+1)*val; } else if(a>=tr[ro].l&&b>=tr[ro].r) { tr[ro].sum+=(tr[ro].r-a+1)*val; } int mid=(tr[ro].l+tr[ro].r)/2; if(a<=mid) add(a,b,ro<<1,val); if(b>mid) add(a,b,ro<<1|1,val);}ll sum;void query(int a,int b,int ro){ if(a<=tr[ro].l&&b>=tr[ro].r) { sum+=tr[ro].sum+tr[ro].val*(tr[ro].r-tr[ro].l+1); return ; } else { tr[ro<<1].val+=tr[ro].val; tr[ro<<1|1].val+=tr[ro].val; tr[ro].sum+=tr[ro].val*(tr[ro].r-tr[ro].l+1); tr[ro].val=0; } int mid=(tr[ro].l+tr[ro].r)/2; if(a<=mid) query(a,b,ro<<1); if(b>mid) query(a,b,ro<<1|1);}int main(){ int n,q; while(scanf("%d%d",&n,&q)!=EOF) { for(int i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); while(q--) { char ch; cin>>ch; int a,b; scanf("%d%d",&a,&b); if(ch=='Q') { sum=0; query(a,b,1); printf("%lld\n",sum); } else if(ch=='C') { ll val; scanf("%lld",&val); add(a,b,1,val); } } }}
阅读全文
1 0
- POJ3468
- POJ3468
- poj3468
- poj3468
- poj3468
- poj3468
- poj3468
- POJ3468
- poj3468
- POJ3468
- poj3468
- poj3468
- poj3468
- poj3468
- poj3468
- POJ3468
- poj3468
- poj3468
- 程序与进程的区别
- Python排列组合之itertools
- 如何在VirtualBox虚拟机中安装Android x86
- JAVA学习总结之泛型
- SED
- poj3468
- malloc & 内存碎片 & 细节
- 2017 ACM-ICPC 亚洲区(北京赛区)网络赛C.Matrix (DP)
- 机器学习中的正则化技术L0,L1与L2范数
- scrapy抓取的中文结果乱码解决办法
- 下载软件 ==》BitComet(比特彗星)
- SPOJ
- 在CentOS7上安装SQL Server 2017
- jsp中四种传递参数的方法&&web中参数字符编码的修改统一