某日,百無聊賴的卿學姐打開了某11區的某魔幻游戲
在這個魔幻的游戲里,生活著一個美麗的公主,但現在公主被關押在了魔王的城堡中。
英勇的卿學姐拔出利刃沖向了拯救公主的道路。
走過了荒野,翻越了高山,跨過了大洋,卿學姐來到了魔王的第一道城關。
在這個城關面前的是魔王的精銳部隊,這些士兵成一字排開。
卿學姐的武器每次只能攻擊一個士兵,并造成一定傷害,卿學姐想知道某時刻從L 到R
這個區間內,從開始到現在累計受傷最嚴重的士兵受到的傷害。
最開始每個士兵的受到的傷害都是0 Input
第一行兩個整數N,Q 表示總共有N個士兵編號從1到N,和Q
個操作。
接下來Q 行,每行三個整數,首先輸入一個t,如果t是1,那么輸入p,x,表示卿學姐攻擊了p這個位置的士兵,并造成了x的傷害。如果t是2,那么輸入L,R,表示卿學姐想知道現在[L,R]
閉區間內,受傷最嚴重的士兵受到的傷害。
1≤N≤100000
1≤Q≤100000
1≤p≤N
1≤x≤100000
1≤L≤R≤N
Output
對于每個詢問,回答相應的值 Sample input and output Sample Input Sample Output
5 4 2 1 2 1 2 4 1 3 5 2 3 3
0 5
解題方法: 復習分塊,從明天開始開一個分塊法的專題,給代碼吧,講解在blibli上有,模仿qsc寫的。
#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+7;int belong[maxn], num, l[maxn], r[maxn];int n, q, block;long long a[maxn], Max[maxn];//num 分塊的個數//block 塊的大小//belong[i]表示i屬于哪一塊//l[i]表示i這塊的左端點位置//r[i]表示i這塊的右端點位置void build(){ block = sqrt(n); num = n / block; if(n % block) num++; for(int i = 1; i <= num; i++){ l[i] = (i - 1)*block + 1, r[i] = i*block; } r[num] = n; for(int i = 1; i <= n; i++){ belong[i] = (i - 1)/block + 1; } for(int i = 1; i <= num; i++){ for(int j = l[i]; j <= r[i]; j++){ Max[i] = max(Max[i], a[j]); } }}void update(int x, int y){ a[x] += y; Max[belong[x]] = max(Max[belong[x]], a[x]);}long long query(int x, int y){ long long ans = 0; if(belong[x] == belong[y]){ for(int i = x; i <= y; i++){ ans = max(ans, a[i]); } return ans; } for(int i = x; i <= r[belong[x]]; i++){ ans = max(ans, a[i]); } for(int i = belong[x] + 1; i < belong[y]; i++){ ans = max(ans, Max[i]); } for(int i = l[belong[y]]; i <= y; i++){ ans = max(ans, a[i]); } return ans;}int main(){ scanf("%d%d", &n, &q); for(int i = 1; i <= q; i++){ int op, l, r; scanf("%d%d%d", &op, &l, &r); if(op == 1) update(l, r); else新聞熱點
疑難解答