HDU 4383 To The Moon 解題報告

2022-04-30 01:18:11 字數 1713 閱讀 2904

已知乙個長為\(n\)的序列\(a\),你需要進行下面的四種操作。

c l r d將區間\([l,r]\)中的數加上\(d\),同時時間加\(1\)

q l r查詢當前時間區間\([l,r]\)中所有數的和

h l r t查詢時間為\(t\)時區間\([l,r]\)中所有數的和

b t將當前時間置為\(t\)

多組資料

每組資料第一行兩個整數\(n,m\)

第二行\(n\)個整數,代表時間為\(0\)時的數列

後面\(m\)行,每行若干個整數,代表一次操作

每乙個查詢操作輸出一行作為答案

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

2 40 0

c 1 1 1

c 2 2 -1

q 1 2

h 1 2 1

4559

1501

對於所有的資料有\(n,m\le 10^5,|a_i| \le 10^9\),\(|d|\le 10^4\),保證所有操作合法。

沒什麼可說的,就是標記永久化一下進行區間修改。

這方面的細節很多,以後需要多加注意。

code:

#include #include #define ll long long

const int n=1e5+10;

int ch[n*30][2],tot,root[n],n,m;

ll sum[n*30],tag[n*30],a[n];

#define ls ch[now][0]

#define rs ch[now][1]

void build(int &now,int l,int r)

int mid=l+r>>1;

build(ls,l,mid),build(rs,mid+1,r);

sum[now]=sum[ls]+sum[rs];

}void change(int las,int &now,int l,int r,int l,int r,ll d)

int mid=l+r>>1;

if(r<=mid) change(ch[las][0],ls,l,mid,l,r,d);

else if(l>mid) change(ch[las][1],rs,mid+1,r,l,r,d);

else change(ch[las][0],ls,l,mid,l,mid,d),change(ch[las][1],rs,mid+1,r,mid+1,r,d);

tag[now]=tag[las];

sum[now]=sum[ls]+sum[rs]+tag[now]*(r+1-l);

}ll query(int now,int l,int r,int l,int r)

void work()

else if(op[0]=='q'||op[0]=='h')

else

scanf("%d",&t),tot=root[t+1]-1;

}}int main()

2018.12.2

Dijkstra演算法解HDU1874

dijkstra演算法是用來解決 確定起點的最短路徑問題 即已知起始結點,求最短路徑的問題。它是常用的最短路徑演算法之一。最常用的路徑演算法有 dijkstra演算法 a 演算法 bellman ford演算法 floyd warshall演算法 johnson演算法。缺陷 它一般用來解決正權,單源...

hdu 1166 樹狀陣列解

樹狀陣列解決 關於樹狀陣列參考大佬的部落格 然後就很好理解這題了,附上 hdu 1166 單點修改,區間查詢 include include include define max 50010 using namespace std inttree max intarr max intn int lo...

HDU 1028 母函式解 完全揹包解

初學母函式,練練手 母函式解 求整數n的整數拆分方法 題目理解為 將數字1 2 3 n 每個數字可以選取無限次,求能組成n的情況總數 函式 1 x x 2 x 3 1 x 2 x 4 1 x 3 x 6 x 9 第一項的意義是 取0個1,取1個1 2個1,3個1 第二項的意義是 取0個2,取1個2 ...