喜聞樂見的簡單樹套樹= =第一維按權值建樹狀陣列,第二維按下標建動態開點線段樹,修改相當於第二維區間加,查詢在樹狀陣列上二分,比一般的線段樹還短= =可惜並不能跑過整體二分= =另外bzoj上的資料有負數= =其他樹套樹方法也是可以的愛怎麼套怎麼套= =
#include#define j (i+j>>1)#define i (j+1)
typedef unsigned ll;
const int n=1e5+5;
ll n,m,q,i,j,k,s,t,u,v;
struct nodee[n*320];
node*a=e,*r[n];
void vary(node*&o,int s,int t,int i=1,int j=n)
}void ask(node*o,int s,int t,int i=1,int j=n) }}
int main()
printf("%d\n",n-j);
}else
for(i=n-k+1;i<=m;i+=i&-i)
vary(r[i],s,t);
}}
BZOJ 3110 Zjoi2013 K大數查詢
title bzoj 3110 zjoi2013 k大數查詢 categories bzoj date 2016 2 3 00 00 00 tags 樹套樹,整體二分 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c 如果是2 a...
BZOJ 3110 Zjoi2013 K大數查詢
title bzoj 3110 zjoi2013 k大數查詢 categories bzoj date 2016 2 3 00 00 00 tags 樹套樹,整體二分 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c 如果是2 a...
BZOJ3110 Zjoi2013 K大數查詢
整體二分 樹狀陣列 這道題和某題類似 整體二分,每次二分乙個值,因為是求第k大,比二分值大的在 l r 區間 1,詢問就問這個區間的數,如果數量大於k,說明實際答案大於二分值,下放右區間,否則下放左區間,k減去詢問的值 因為後面不會再考慮mid r的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...