題意:
有乙個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 內的英雄的身高全部...