教主最近學會了一種神奇的魔法,能夠使人長高。於是他準備演示給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 31 2 3 4 5
a 1 5 4
m 3 5 1
a 1 5 4
輸出樣例#1:
23
【輸入輸出樣例說明】
原先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 ...