洛谷P2801 教主的魔法 分塊

2021-08-02 02:50:03 字數 1421 閱讀 2780

題目描述

教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給xmyz資訊組每個英雄看。於是n個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1、2、……、n。

每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間[l, r](1≤l≤r≤n)內的英雄的身高全部加上乙個整數w。(雖然l=r時並不符合區間的書寫規範,但我們可以認為是單獨增加第l(r)個英雄的身高)

cyz、光哥和zjq等人不信教主的邪,於是他們有時候會問wd閉區間 [l, r] 內有多少英雄身高大於等於c,以驗證教主的魔法是否真的有效。

wd巨懶,於是他把這個回答的任務交給了你。

輸入輸出格式

輸入格式:

第1行為兩個整數n、q。q為問題數與教主的施法數總和。

第2行有n個正整數,第i個數代表第i個英雄的身高。

第3到第q+2行每行有乙個操作:

(1) 若第乙個字母為「m」,則緊接著有三個數字l、r、w。表示對閉區間 [l, r] 內所有英雄的身高加上w。

(2) 若第乙個字母為「a」,則緊接著有三個數字l、r、c。詢問閉區間 [l, r] 內有多少英雄的身高大於等於c。

輸出格式:

對每個「a」詢問輸出一行,僅含乙個整數,表示閉區間 [l, r] 內身高大於等於c的英雄數。

分塊**好。按每個塊大小為sqrt(n)分塊,另外開乙個陣列,把原始陣列複製過去,塊內元素保持有序。對每個塊維護乙個增量,代表塊內的所有元素應該增加的數量,更新時,對完整的塊,更新增量即可,不完整的塊,直接暴力更新。查詢時,對不完整的塊,暴力查詢,對於完整的塊,二分查詢塊內大於等於c的數量。注意二分的細節,我寫的時候是找到第乙個大於等於c的位置,然後塊的右端減去這個位置再加1,但是塊內元素可能全小於c,這時這個位置應該設成超尾的,謹記

#include 

using namespace std;

const int n = 1e6 + 10;

int n, m;

int block, sz;

intpos[n], l[n], r[n], add[n];

int a[n], b[n];

void reset(int

x)void init()

r[sz] = n;

for(int i = 1; i <= sz; i++) reset(i);

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

else

}int bin_serach(int

x, int c)

return r[x] - ans + 1;

}int query(int l, int r, int c)

else

return ans;

}int main()

return

0;}

洛谷 P2801 教主的魔法 分塊

教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給xmyz資訊組每個英雄看。於是n個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1 2 n。每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間 l,r 1 l r n 內的英雄的身高全部加上乙個整數w。雖然l ...

P2801 教主的魔法 分塊)

題目傳送 長度為 n n le 1000000 的陣列,q q le 3000 次操作。修改操作即將某個區間的值增加某個不大於1000的值,查詢操作即查詢某個區間比c大於等於的數有多少個 我們用乙個陣列 add i 來表示第 i 段增量,如果查詢區間完全包含第 i 段,那麼就相當於是在原陣列中查詢大...

洛谷P2801 教主的魔法

教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給xmyz資訊組每個英雄看。於是n個英雄們又一次聚集在了一起,這次他們排成了一列,被編號為1 2 n。每個人的身高一開始都是不超過1000的正整數。教主的魔法每次可以把閉區間 l,r 1 l r n 內的英雄的身高全部加上乙個整數w。雖然l ...