洛谷2801 教主的魔法(分塊經典入門題)

2022-05-14 15:27:28 字數 1221 閱讀 1645

點此看題面

大致題意:給你乙個序列,要你支援兩種操作:第一種是區間加法,第二種是查詢區間內大於等於\(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...