題解:整體二分答案即可
#include #define ll long longconst int maxn=5e4+10;
using namespace std;
ll sum1[maxn],sum2[maxn];
int n,m;
vectorvec;
int get_id(int x)
void update1(int x,ll vul)
ll sum1(int x)
void update2(int x,ll vul)
ll sum2(int x)
typedef struct nodenode;
node que[maxn];
int id[maxn],ed[maxn],ip[maxn];
void update(int t)
void clear(int t)
ll querty(int t)
int flag=0;
void slove(int ql,int qr,int l,int r)
else
} //if(flag==2)cout<=vec[mid-1])clear(id[i]);}
//for(int i=1;i<=n;i++)sum1[i]=sum2[i]=0;
for(int i=1;i<=cnt2;i++)id[ql+i-1]=ed[i];
for(int i=1;i<=cnt1;i++)id[ql+cnt2+i-1]=ip[i];
slove(ql,ql+cnt2-1,l,mid-1);
slove(ql+cnt2,qr,mid+1,r);
}int main()
sort(vec.begin(),vec.end());
int sz=unique(vec.begin(),vec.end())-vec.begin();
slove(1,m,1,sz);
for(int i=1;i<=m;i++)
}
time limit: 20 sec memory limit: 512 mb
submit: 11674 solved: 3512
[submit][status][discuss]
有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c
如果是2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少。
第一行n,m
接下來m行,每行形如1 a b c或2 a b c
輸出每個詢問的結果
2 51 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 312
1【樣例說明】
第乙個操作 後位置 1 的數只有 1 , 位置 2 的數也只有 1 。 第二個操作 後位置 1
的數有 1 、 2 ,位置 2 的數也有 1 、 2 。 第三次詢問 位置 1 到位置 1 第 2 大的數 是
1 。 第四次詢問 位置 1 到位置 1 第 1 大的數是 2 。 第五次詢問 位置 1 到位置 2 第 3
大的數是 1 。
n,m<=50000,n,m<=50000
a<=b<=n
1操作中abs(c)<=n
2操作中c<=maxlongint
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的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...