3110 Zjoi2013 K大數查詢

2021-07-09 02:45:19 字數 1685 閱讀 6510

蒟蒻表示樹套樹是什麼,能吃嗎?

唉無奈本蒟蒻過於沙茶不會樹套樹。

只好整體二分水一水了。

跑了近4000ms,懷疑比樹套樹還慢了。。。。。。

#include#include#includeusing namespace std;

const int n=50000+5;

const int inf=1e9;

struct queryq[n],q1[n],q2[n];

int tmp[n],ans[n];

struct node;

struct segement_tree

void pushdown(int o)

}void build(int o,int l,int r)

}void update(int o,int a,int b,int val)else

int mid=l+r>>1;

for(int i=head;i<=tail;i++)

if(q[i].tp==1&&q[i].c>mid)solver.update(1,q[i].a,q[i].b,1);

else if(q[i].tp==2)tmp[i]=solver.query(1,q[i].a,q[i].b);

for(int i=head;i<=tail;i++)

if(q[i].tp==1&&q[i].c>mid)solver.update(1,q[i].a,q[i].b,-1);

int l1=0,l2=0;

for(int i=head;i<=tail;i++)

if(q[i].tp==2)else

for(int i=1;i<=l1;i++)q[head+i-1]=q1[i];

for(int i=1;i<=l2;i++)q[head+l1+i-1]=q2[i];

divide(head,head+l1-1,mid+1,r);

divide(head+l1,tail,l,mid);

}int main()

divide(1,m,mi,mx);

for(int i=1;i<=num;i++)

printf("%d\n",ans[i]);

return 0;

}

好了現在本蒟蒻會樹套樹了,於是用樹套樹來水一水。

權值線段樹套普通線段樹。

於是乎~15秒多!!!!

整體二分才4秒左右好不好啊。

原來整體二分才是正解- -

#include#include#includeusing namespace std;

int root[200005];

int ls[20000005],rs[20000005],sum[20000005],add[20000005];

int sz,n;

void pushdown(int o,int l,int r)

void pushup(int o)

void update(int &o,int l,int r,int a,int b)else

update(root[o],1,n,a,b);

}int kth(int a,int b,int c)

return l;

}int main()

return 0;

}

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