蒟蒻表示樹套樹是什麼,能吃嗎?
唉無奈本蒟蒻過於沙茶不會樹套樹。
只好整體二分水一水了。
跑了近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的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...