洛谷P2801 教主的魔法

2021-08-16 18:37:21 字數 1735 閱讀 2260

教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給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的英雄數。

輸入樣例#1:

5 3

1 2 3 4 5

a 1 5 4

m 3 5 1

a 1 5 4

輸出樣例#1:

2

3

【輸入輸出樣例說明】

原先5個英雄身高為1、2、3、4、5,此時[1, 5]間有2個英雄的身高大於等於4。教主施法後變為1、2、4、5、6,此時[1, 5]間有3個英雄的身高大於等於4。

【資料範圍】

對30%的資料,n≤1000,q≤1000。

對100%的資料,n≤1000000,q≤3000,1≤w≤1000,1≤c≤1,000,000,000。

典型分塊。。。

我現在才會分塊是不是太遲了???

怎麼用分塊做呢?

先看看怎麼查詢塊內》=k的個數的操作呢?

我們可以先將這個塊排好序,然後二分查詢k的值就好了。

至於兩邊不完整的塊,暴力查詢還沒有排序的原本序列直接找就好了

再看看怎麼修改??

對於整塊,我們可以打上乙個add標記,這樣二分查詢就要查 >= k-add 的值。

對於不完整的塊,我們暴力修改,再直接排序整個塊就好了

附**:

#include#include#include#include#define maxn 1000010

using namespace std;

int n,m,blo,num;

int val[maxn],b[maxn],flag[maxn],left[maxn],right[maxn],bl[maxn];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void reset(int x)

int find(int x,int k)

void work()

}void init()

for(int i=1;i<=num;i++)

right[num]=n;

for(int i=1;i<=num;i++)sort(b+left[i],b+right[i]+1);

}int main()

洛谷P2801 教主的魔法 分塊

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

洛谷 P2801 教主的魔法 分塊

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

P2801 教主的魔法

題目描述 這裡 思路 這題似乎是道分塊裸題。在查詢時,我們可以對每個塊進行排序,然後二分查詢 k的元素,輸出答案。不幸的是,這道題有點卡分塊。我們可以改變塊的大小和加入優化進行卡常。include pragma gcc optimize 2 pragma gcc optimize 3 pragma ...