BZOJ3110 Zjoi2013 K大數查詢

2022-05-20 23:33:24 字數 1699 閱讀 1717

題解:整體二分答案即可

#include #define ll long long

const 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的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...