BZOJ 3343 教主的魔法(分塊)

2022-05-26 10:30:13 字數 2237 閱讀 9185

題意:

有乙個1e6的陣列,t次操作:將[l,r]內的值增加w,或者查詢[l,r]內的值大於等於add的

思路:分塊,塊大小為sqrt(n),每次只需要暴力頭尾兩塊,中間的整塊打標記,

對於查詢查操作,塊內排序然後二分即可

複雜度o(t(sqrt(n)+sqrt(n)logn))

**:可以弄兩個陣列對應著寫,會比我這樣stl亂寫快一倍

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fst first

#define sc second

#define pb push_back

#define mem(a,b) memset(a,b,sizeof(a))

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define lc root<<1

#define rc root<<1|1

//#define lowbit(x) ((x)&(-x))

using

namespace

std;

typedef

double

db;typedef

long

double

ldb;

typedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pi;typedef pair

pll;

const db eps = 1e-6

;const

int mod = 1e9+7

;const

int maxn = 1e6+100

;const

int maxm = 2e6+100

;const

int inf = 0x3f3f3f3f;

//const db pi = acos(-1.0);

struct

node;

intn, q;

vector

blc[maxn];

intblock;

bool

cmp(node a, node b)

ll add[maxn];

intmain()

for(int i = 0; i <= (n-1)/block; i++)

while(q--)

sort(blc[bx].begin(), blc[bx].end(),cmp);

}else

sort(blc[bx].begin(), blc[bx].end(),cmp);

for(int i = 0; i < (int)blc[by].size(); i++)sort(blc[by].begin(), blc[by].end(),cmp);

for(int i = bx+1; i < by; i++)}}

else

}else

for(int i = 0; i < (int)blc[by].size(); i++)

//printf("--%d\n",ans);

for(int i = bx+1; i < by; i++)

else l = mid+1

; }

ans+=block-pos;}}

printf(

"%d\n

",ans);}}

return0;

}/*5 31 2 3 4 5

a 1 5 4

m 3 5 1

a 1 5 4

5 73 1 4 2 5

a 1 5 4

m 3 5 1

m 3 5 2

a 1 5 4

m 1 1 3

a 1 5 4

a 1 5 10

5 33 1 4 2 5

a 1 5 10

m 1 5 2

a 1 5 10

*/

bzoj3343 教主的魔法 分塊

算是第一次寫分塊吧。這道題是最裸的分塊,每個塊上打上加標記,另外維護乙個塊內的排好序的陣列。對於修改操作,如果l,r在乙個塊內,暴力更改,之後重建。如果l,r不在乙個塊內,中間的塊處理標記,其餘部分暴力更改,之後重建。對於詢問操作,如果l,r在乙個塊內,暴力查詢 如果l,r不在乙個塊內,中間的塊裡二...

BZOJ3343 教主的魔法(分塊)

傳送門 正兒八經的分塊題。整個塊打add標記,其餘的暴力加。詢問的時候整個塊sort之後二分找,其餘的暴力找。include include include include include include using namespace std const int max n 1e6 5 const...

BZOJ3343 教主的魔法(分塊)

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