poj 3468 A Simple Problem with Integers
2014-09-17 11:01
375 查看
题目链接:http://poj.org/problem?id=3468
题目描述:有一个长度为n 的序列,有两个操作
1. C l r c 给[l ,r ]增加c (-10000<=c<=10000)
2. Q l r 查询[l ,r ]的和
解题思路:线段树直接秒!每个节点维护 区间整体增加的值,以及区间和
但是线段树常数有点大。。。。没办法
另外,有负数的猥琐输入并不能加速。。。sad
题目描述:有一个长度为n 的序列,有两个操作
1. C l r c 给[l ,r ]增加c (-10000<=c<=10000)
2. Q l r 查询[l ,r ]的和
解题思路:线段树直接秒!每个节点维护 区间整体增加的值,以及区间和
但是线段树常数有点大。。。。没办法
另外,有负数的猥琐输入并不能加速。。。sad
//#pragma comment(linker,"/STACK:102400000,102400000") #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define ll long long #define db double #define PB push_back #define lson k<<1 #define rson k<<1|1 using namespace std; const int N = 100005; const ll INF = 1000000000; struct node { int l,r; int val; ll sum; } tr[N*4]; int a ; void push_up(int k) { tr[k].sum=tr[lson].sum+tr[rson].sum; } void push_down(int k) { if(tr[k].val) { tr[lson].val+=tr[k].val; tr[lson].sum+=(ll)tr[k].val*(ll)(tr[lson].r-tr[lson].l+1); tr[rson].val+=tr[k].val; tr[rson].sum+=(ll)tr[k].val*(ll)(tr[rson].r-tr[rson].l+1); tr[k].val=0; } } void build(int k,int l,int r) { tr[k].l=l,tr[k].r=r; tr[k].val=0; if(l<r) { int mid=(l+r)>>1; build(lson,l,mid); build(rson,mid+1,r); push_up(k); }else tr[k].sum=a[l]; } void add(int k,int l,int r,int val) { if(tr[k].l==l&&tr[k].r==r) { tr[k].val+=val; tr[k].sum+=(ll)val*(ll)(tr[k].r-tr[k].l+1); return; } push_down(k); int mid=(tr[k].l+tr[k].r)>>1; if(r<=mid) add(lson,l,r,val); else if(l>mid) add(rson,l,r,val); else add(lson,l,mid,val),add(rson,mid+1,r,val); push_up(k); } ll query(int k,int l,int r) { if(tr[k].l==l&&tr[k].r==r) { return tr[k].sum; } push_down(k); int mid=(tr[k].l+tr[k].r)>>1; if(r<=mid) return query(lson,l,r); else if(l>mid) return query(rson,l,r); else return query(lson,l,mid)+query(rson,mid+1,r); } int main() { #ifdef PKWV freopen("in.in","r",stdin); #endif // PKWV int n,Q; scanf("%d%d",&n,&Q); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); while(Q--) { char ch[10]; scanf("%s",ch); if(ch[0]=='Q') { int l,r; scanf("%d%d",&l,&r); printf("%I64d\n",query(1,l,r)); }else { int l,r,c; scanf("%d%d%d",&l,&r,&c); add(1,l,r,c); } } return 0; }
相关文章推荐
- poj 3468 A Simple Problem with Integers (线段树成段更新)
- poj 3468 A Simple Problem with Integers 线段树模板区间更新
- poj 3468 A Simple Problem with Integers(线段树区间累加)
- poj 3468 A Simple Problem with Integers(线段树——区间更新)
- POJ 3468_A Simple Problem with Integers(树状数组)
- POJ-3468-A Simple Problem with Integers
- poj 3468 A Simple Problem with Integers (线段树---成段更新)
- poj 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers(线段树 区间更新)
- poj 3468 A Simple Problem with Integers
- poj 3468 小白算法练习 a simple problem with integers 线段树
- poj 3468 A Simple Problem with Integers
- C - A Simple Problem with Integers - poj 3468(区间更新)
- [ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)
- POJ 3468 A Simple Problem with Integers(线段树,裸)
- POJ 3468-A Simple Problem with Integers(线段树_区间更新+lazy标记)
- POJ 3468 A Simple Problem with Integers -
- POJ 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers 线段树区间更新
- poj-3468-A Simple Problem with Integers