Poj 3468 A Simple Problem with Integers(树状数组&&线段树)
2016-06-14 21:16
459 查看
代码如下:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef long long ll; const ll N = 100007; ll a , b , c ; void add(ll s[], ll i, ll x, ll n) { while(i <= n) { s[i] += x; i += i&(-i); } } ll sum(ll s[], ll i) { ll res = 0; while(i > 0) { res += s[i]; i -= i&(-i); } return res; } int main() { ll n, q, s; while(scanf("%I64d%I64d",&n, &q)!=EOF) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); for(ll i=1; i<=n; ++i) { scanf("%I64d",&s); add(a, i, s, n); } char ch; ll x, y, z; for(ll i=1; i<=q; ++i) { scanf(" %c", &ch); if(ch == 'Q') { scanf("%I64d%I64d",&x, &y); ll ans = sum(a, y) + (y+1)*sum(b, y) - sum(c, y);//前y项和 ll res = sum(a, x-1) + x* sum(b, x-1) - sum(c, x-1);//前x+1项和 printf("%I64d\n", ans - res); } else { scanf("%I64d%I64d%I64d", &x, &y, &z); add(b, x, z, n); add(b, y+1, -z, n); add(c, x, x*z, n); add(c, y+1, (y+1)*(-z), n); } } } return 0; }
线段树写法(很久以前写过的,看完感觉好渣的代码,这题用线段树很好写的,不想敲了):
#include<stdio.h> #include<limits.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<vector> #include<queue> #include<map> #include<algorithm> using namespace std; struct point { long long x,add; point() { x=0,add=0; } }; point tree[300000]; int n,q; int a[100005]; void add(int a,int b,int k,int x,int l,int r) { if(l>=a&&r<=b) tree[k].add += x; else if(b>l&&a<r) { tree[k].x += (min(b,r)-max(a,l))*x; add(a,b,2*k+1,x,l,(l+r)/2); add(a,b,2*k+2,x,(l+r)/2,r); } } long long query(int a,int b,int k,int l,int r) { if(l>=a&&r<=b) return (long long)((r-l)*tree[k].add)+tree[k].x; else if(b>l&&a<r) { long long ans=(min(r,b)-max(a,l))*tree[k].add; ans+=query(a,b,2*k+1,l,(l+r)/2); ans+=query(a,b,2*k+2,(l+r)/2,r); return ans; } return 0; } int main() { while(scanf("%d%d",&n,&q)!=EOF) { for(int i=0; i<n; i++) scanf("%d",&a[i]); for(int i=0; i<n; i++) add(i,i+1,0,a[i],0,n); for(int i=1; i<=q; i++) { char c; int l,r,x; scanf(" %c %d %d",&c,&l,&r); if(c=='Q') printf("%lld\n",query(l-1,r,0,0,n)); else { scanf("%d",&x); add(l-1,r,0,x,0,n); } } } return 0; }
相关文章推荐
- 线段树题集
- 线段树
- hdu1754
- HDU1394
- LightOJ 1067 Combinations 组合数取模
- 敌兵布阵 (1)
- I Hate It (1)
- LCIS (2)
- A Simple Problem with Integers (2)
- Mayor's posters (3)
- Buy Tickets (3)
- Codeforces Coder-Strike 2014 - Finals (online edition, Div. 1)
- 线段树
- UVA - 12532 Interval Product
- bzoj 4499
- HDU 1166 敌兵布阵
- POJ 2352 Stars
- POJ 3264 Balanced Lineup
- hdu 1542 求矩形并的面积
- 关于数据结构之线段树