多標記處理

2021-07-16 08:56:05 字數 2264 閱讀 1081



description

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。 有長為n的數列,不妨設為a1,a2,…,an 。有如下三種操作形式: (1)把數列中的一段數全部乘乙個值; (2)把數列中的一段數全部加乙個值; (3)詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模p的值。

input

第一行兩個整數n和p(1≤p≤1000000000)。第二行含有n個非負整數,從左到右依次為a1,a2,…,an, (0≤ai≤1000000000,1≤i≤n)。第三行有乙個整數m,表示操作總數。從第四行開始每行描述乙個操作,輸入的操作有以下三種形式: 操作1:「1 t g c」(不含雙引號)。表示把所有滿足t≤i≤g的ai改為ai×c (1≤t≤g≤n,0≤c≤1000000000)。 操作2:「2 t g c」(不含雙引號)。表示把所有滿足t≤i≤g的ai改為ai+c (1≤t≤g≤n,0≤c≤1000000000)。 操作3:「3 t g」(不含雙引號)。詢問所有滿足t≤i≤g的ai的和模p的值 (1≤t≤g≤n)。 同一行相鄰兩數之間用乙個空格隔開,每行開頭和末尾沒有多餘空格。

output

對每個操作3,按照它在輸入中出現的順序,依次輸出一行乙個整數表示詢問結果。

sample input

7 43

1 2 3 4 5 6 7

51 2 5 5

3 2 4

2 3 7 9

3 1 3

3 4 7

sample output

2358

hint

【樣例說明】

初始時數列為(1,2,3,4,5,6,7)。

經過第1次操作後,數列為(1,10,15,20,25,6,7)。

對第2次操作,和為10+15+20=45,模43的結果是2。

經過第3次操作後,數列為(1,10,24,29,34,15,16}

對第4次操作,和為1+10+24=35,模43的結果是35。

對第5次操作,和為29+34+15+16=94,模43的結果是8。

測試資料規模如下表所示

資料編號 1 2 3 4 5 6 7 8 9 10

n= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

m= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

題解:區間問題,三個操作。1:把區間內的數乘上c,2:把區間內的數加上c,3:求區間和。

上篇我們寫過2,3操作的題,這次加了乙個操作,方法跟上題相同,再加乙個標記,加法:add。乘法:mul

注意標記下傳時。具體解釋看**部分。

**:#include #include #include #include #include #include #define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define maxn 100010

using namespace std;

ll sum[maxn<<2];

ll add[maxn<<2];

ll mul[maxn<<2];

ll mod;

void pushup(int rt)//向上更新

void pushdown(int rt,int m)//向下更新

void build(int l, int r, int rt)

int m = (l + r) >> 1;

build(lson);

build(rson);

pushup(rt);

}void update(int l, int r,int c,int cc, int l, int r, int rt)

int m=(r+l)>>1;

if(l<=m)

update(l,r,c,cc,lson);

if(r>m)

update(l,r,c,cc,rson);

pushup(rt);

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

int main()

{ int n,m,d;

scanf("%d%d",&n,&mod);

build(1, n, 1);

scanf("%d",&m);

for(int i=0; i

多標記處理(2)UVA 11402

題面下不出來 如果有想做的vj查 uva 11402 吧。給出題意 對乙個01區間進行4種操作。1 區間值都置為1.2 區間值都置為0.3 區間值01互換。4求出區間和。題解 第乙個操作可以等效成區間值 0 1.第二個操作可以等效成區間值 0.第三個操作可以等效成區間值 1 1。第四個操作就是線段樹...

MPLS 多協議標記交換

mpls multi propocol label switching 即多協議標記交換。mpls是一種在開放的通訊網上利用標籤引導資料高速 高效傳輸的新技術。它的價值在於能夠在乙個無連線的網路中引入連線模式的特性 其主要優點是減少了網路複雜性,相容現有各種主流網路技術,能降低50 網路成本,在提供...

批處理刪除SVN標記

簡單的說,批處理就是一些dos命令的組合。今天小試牛刀,寫了第乙個批處理程式,順便也了解了一下常用的dos命令。以前總覺得dos的東西有些過時,一直沒有好好的學過,初次嘗試了一下其便利性,也算多了一點知識。程式 如下 echo off start 啟動過程,切換目錄 set pwd cd cd 1 ...