Luogu P2801 教主的魔法 分塊

2022-02-23 12:27:18 字數 1183 閱讀 1981

修改,就是乙個區間修改的常規操作,但是為了迎合查詢的需要,對兩端的不完整的塊需要暴力重構,重新進行排序操作,保證每一塊都是單調上公升的順序。

然後再說進行查詢的操作,起初,我們需要在每乙個塊內進行排序。保證順序時單調上公升的(在每乙個塊內,是獨立的),然後查詢的時候對每一塊($k$)都二分查詢到大於 $num + tag[k]$ 的第乙個數的位置,然後就可以得到一共有多少大於 $num$ 的數了。

值得注意的是,有些題解寫的是對原序列直接進行排序,這就有乙個錯誤,那就是在排序之後序列的順序改變,改變了之後在進行區間修改的時候就不能保證正確性了。

所以我們開乙個 vector 將每個塊內的數都存下來。我的** t 了乙個點,但是了 o2 過了,懶得再去卡常了

#include #include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1e6+3

;int n, q, arr[maxn], in

[maxn], cnt, tag[maxn];

vector

b[1003

];struct

block

while (c <= '

9' && c >= '

0')

x *=f;

}void reset(int

k)

void

build()

for(int i=in[1]; i<=in[n]; i++)

sort(b[i].begin(), b[i].end());

}void update(int l, int r, int

num)

for(int i=in[l]+1; itag[i] +=num;

}int check(int k, int

num)

int query(int l, int r, int

num)

for(int i=in[l]+1; ians +=check(i, num);

return

ans;

}block ()

}}blo;

int main() {}

Luogu P2801教主的魔法(分塊)

題目鏈結 激動qwq。這是我a的第一道分塊。分塊之後對塊內元素暴力sort。修改的時候對於整塊打個標記,查詢的時候只需要查c tag就行了 對於非整塊,暴力修改,改完之後sort 對於查詢 非整塊暴力查詢,整塊二分c tag的位置就好啦 include include include include...

Luogu 2801 教主的魔法

給出n個數字 m l r c 給 l r的數字加c a l r c 查詢 l r c的數字個數 區間加!線段樹 線段樹不能維護第二個操作啊 霧 分塊吧qwq 我們維護乙個塊的整體加值就好啦 luogu 2801 include include include include const int ma...

P2801 教主的魔法

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