CF 295A - Greg and Array 差分數列
一維的差分?jǐn)?shù)列如下定義:
假設(shè)原數(shù)組為a[1]...a[n],a[0] = 0
差分?jǐn)?shù)列數(shù)組為d[1]...d[n]
則d[i] = a[i]-a[i-1] (d數(shù)組初始化)
?
?
題目:
給出原始數(shù)列a[1]...a[n]
給出m個(gè)操作方式:
l r val
表示把a(bǔ)[l],...,a[r]都增加val
現(xiàn)在需要執(zhí)行以下op條操作:
x y
表示執(zhí)行第x條操作方式到第y條操作方式
詢問(wèn):最終的數(shù)列a
分析:
一:線段樹(shù)
顯然可以用線段樹(shù)成段更新。
1.對(duì)於每個(gè)操作,我們可以用樹(shù)狀數(shù)組、線段樹(shù)、差分?jǐn)?shù)列,統(tǒng)計(jì)一下每條操作方式的次數(shù)c[i]
2.統(tǒng)計(jì)完之後對(duì)於每個(gè)操作方式進(jìn)行成段更新,l_i r_i val_i*c[i]
3.遞歸一次得到所有節(jié)點(diǎn)的值。
二:樹(shù)狀數(shù)組
樹(shù)狀數(shù)組,跟線段樹(shù)差不多。。。
三:差分?jǐn)?shù)列
1.由於是每個(gè)操作都是成段進(jìn)行對(duì)成段的更新。
所以我們先對(duì)所有的操作用差分?jǐn)?shù)列來(lái)統(tǒng)計(jì)一下每條操作方式執(zhí)行的次數(shù)。
2.統(tǒng)計(jì)出每條操作方式的次數(shù)后,對(duì)於每個(gè)操作方式進(jìn)行又一次的差分操作。
3.統(tǒng)計(jì)完之後直接加上原數(shù)列的大小即為答案
?
#include <set> #include <map> #include <cmath> #include <queue> #include <stack> #include <string> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;typedef long long ll; typedef unsigned long long ull;#define lx(x) (x<<1) #define rx(x) (x<<1|1) #define debug puts("here") #define rep(i,n) for(int i=0;i<n;i++) #define rep1(i,n) for(int i=1;i<=n;i++) #define REP(i,a,b) for(int i=a;i<=b;i++) #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++) #define pb push_back #define RD(n) scanf("%d",&n) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)/******** program ********************/const int MAXN = 1e5+5;int tmp[3][MAXN],a[MAXN]; ll ans[MAXN],t[MAXN];int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout); #endifint n,m,op;while(~RD3(n,m,op)){rep1(i,n)RD(a[i]);memset(ans,0,sizeof(ans));memset(t,0,sizeof(t));rep1(i,m)RD3(tmp[0][i],tmp[1][i],tmp[2][i]);int x,y,z;while(op--){ /// 對(duì)於操作,統(tǒng)計(jì)出每條操作方式執(zhí)行的次數(shù)RD2(x,y); // mans[y+1] --;ans[x] ++;}rep1(i,m) /// 大小為m(我這裡WA了3次 = =。)ans[i] += ans[i-1];rep1(i,m){ /// 對(duì)於每條操作方式,進(jìn)行又一次的差分操作x = tmp[0][i];y = tmp[1][i];z = tmp[2][i];ll qq = ll(z)*ans[i];t[y+1] -= qq;t[x] += qq;}rep1(i,n) /// 統(tǒng)計(jì)t[i] += t[i-1];rep1(i,n)cout<<t[i]+a[i]<<" ";cout<<endl;}return 0; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/yejinru/archive/2013/04/17/3026701.html
總結(jié)
以上是生活随笔為你收集整理的CF 295A - Greg and Array 差分數列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JavaScript那些事儿(1):对比
- 下一篇: 例5-17和例5-18