點此看題面
大致題意:給你乙個序列,要你支援兩種操作:第一種是區間加法,第二種是查詢區間內大於等於\(x\)的數的個數。
這應該是一道比較經典的分塊入門題吧。
首先,我們將序列分塊。
對於修改操作,暴力修改兩邊的不完整的塊,中間的塊直接打標記記錄即可。
對於詢問操作,暴力求出兩邊的不完整的塊的答案,中間的塊我們可以在塊內二分,最後將全部答案加起來即可。
#include#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<0?-(x):(x))
#define ll long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define fsize 100000
#define tc() (finnow==finend&&(finend=(finnow=fin)+fread(fin,1,fsize,stdin),finnow==finend)?eof:*finnow++)
#define pc(ch) (foutsizev[size+5];//用vector存下每個塊中元素排序後的結果
inline void read(int &x)
inline void read_alpha(char &x)
inline void write(int x)
inline void f5(int x)//更新乙個塊的vector
inline void update(int l,int r,int x)//區間加法
//如果左邊與右邊不在同乙個塊,就暴力修改右邊不完整的塊,並更新這個塊的vector
for(i=pos[l]+1;i>1]>=x) r=(res=mid)-1;
else l=mid+1;
}return lim-res;//返回有編號為s的塊內有多少個元素大於等於x
}inline int query(int l,int r,int x)//查詢區間內大於等於x的數的個數
int main()
return fwrite(fout,1,foutsize,stdout),0;
}
洛谷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 ...
洛谷 2801 教主的魔法 分塊 二分
題目鏈結 分塊。對於塊之外的,暴力修改 查詢 對於一整塊內的,修改後sort使每一塊塊有序,詢問時二分 c的位置求個數 include include include includeusing namespace std const int n 1e6 5 int n,m,a n bel n siz...