自從看了《哈利波特》,小y就十分渴望獲得魔法值。於是他和一群嚮往魔法的孩子(當然這些孩子們都是不會魔法的)來到了哈利波特的家,大家坐成一排。哈利波特會不時的給大家傳輸魔法。一道難得的好題= =哈利每次會選擇乙個區間,給這個區間裡的孩子們傳輸魔法:最左邊的孩子給一點,第二個給兩點……哈利有時會突然問你某乙個孩子已經有了多少魔法。
第一行兩個正整數 n,m,表示有 n 個孩子,哈利有 m 次操作。
接下來 m 行,每行代表乙個操作。第乙個字元為 ci,若 ci=『c』則此次操作為傳送魔法操作,接下來會有兩個整數li,ri,表示此次送魔法值的區間。若 ci=『q』則此次操作為詢問操作,接下來乙個整數xi,表示詢問第xi個孩子當前的魔法值。
對於每組詢問輸出一行,僅包含乙個整數,表示答案對 1,000,000,007 取模(mod)的結果。
3 4c 1 3
q 2c 2 3
q 2對於 30%的資料,n,m≤1,000;
對於 100%的資料,n,m≤100,000。
實際上這道題除了想出思路,哪都很容易= =
這道題的主要難度就在於如何更改上,等差數列更改讓一些資料結構顯得很吃力,但實則不然,我們完全可以用線段樹來實現這個東西
我們發現,我們需要在一段區間更新一段以$1$為首項的等差數列,那麼,我們假如只在區間的每乙個點加$1$,效果會怎樣?
顯然這時候如果單點求和是不行的,但如果我們求字首和的話,我們就可以得到等差數列求和的效果了不是嗎?
我們只需要在區間中的每乙個點都加上$1$,右端點右面乙個點減去$r-l+1$就可以達到差分的目的,查詢時只需要查詢單點字首和即可
1 #include2 #include3 #include4view codeusing
namespace
std;
5 inline int
read()
12 typedef long
long
l;13
intn,m;
14 l sum[400005],add[400005
];15
const l mod=1000000007
;16 inline void pushup(int
i)19 inline void pushdown(int i,int
len)29}
30 inline void update(int ll,int rr,l w,int l,int r,int
i)37 pushdown(i,r-l+1
);38
int mid((l+r)>>1
);39
if(ll<=mid)
40 update(ll,rr,w,l,mid,i<<1
);41
if(mid
42 update(ll,rr,w,mid+1,r,i<<1|1
);43
pushup(i);44}
45 inline l query(int ll,int rr,int l,int r,int
i)57
char op[2
];58 inline int
gg()
68else73}
74return0;
75}76int
k(gg());
77int main()
2 26 演算法練習
時間限制 1.0s 記憶體限制 512.0mb 給定兩個僅由大寫字母或小寫字母組成的字串 長度介於1到10之間 它們之間的關係是以下4中情況之一 1 兩個字串長度不等。比如 beijing 和 hebei 2 兩個字串不僅長度相等,而且相應位置上的字元完全一致 區分大小寫 比如 beijing 和 ...
日思清單2 26
訂閱李笑來 通往財富自由之路 這個專欄已經差不多半年了,這半年的心態從 一定要公升級我的作業系統 到 其實等過幾天看 只是把3分鐘熱度延長了而已。由於大部分人都不是含著 密鑰匙 出生,中國也一直都有 望子成龍 或 望女成鳳 的傳統,所以可以假定我們每個人都希望出人頭地,你還可以想象大家一般還會說 等...
藍橋杯練習 2 26
字串對比 思路 此題主要考察c 中字串的一些應用 c 中可以直接定義乙個空字串,然後直接讀入 string s1 cin s1 也可以用getline 讀入 接受乙個字串,可以接收空格並輸出 string str getline cin,str 都需包含 include 獲得字串長度len s1.s...