description
有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c
如果是2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少。
input
第一行n,m
接下來m行,每行形如1 a b c或2 a b c
output
輸出每個詢問的結果
sample input
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
sample output
1 2
1 hint
【樣例說明】
第乙個操作 後位置 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
正解:整體二分?樹套樹也可以搞 大概我一開始的思路是線段樹套splay 應該是正確的 但是時間卡的有點緊 log^3不一定可過 稍微看了眼題解 線段樹+線段樹 然後思考 發現可做
外層權值線段樹 裡層 位置線段樹 權值線段樹就相當於我在二分答案一樣 每個管轄的權值都建位置線段樹 然後每次在權值線段樹上二分即可 注意位置線段樹動態開點 保證記憶體 另外可以像我這樣pushdown update也可以像icefox巨佬一樣直接類似掃瞄線覆蓋的這麼寫也okay 並且常數小很多orz 此題注意longlong 另外題目中說c可能負數 ?真實資料似乎並沒有
#include
#include
#define n 55000
#define ll long long
using namespace std;
inline char gc()
return
*s++;
}inline int
read()
while(ch<='9'&&ch>='0') x=x
*10+ch-'0',ch=gc();
return
x*f;
}struct nodeqr[n];
int n,m,num,cnt,a1[n],nn,rt[n*20],root;
struct node1tree[n<<1],tr[n*400];
inline void build(int &x,int l,int r)
inline void pushdown(int
x,int l,int r)
inline void ins(int &x,int l,int r,int l1,int r1)
int mid=l+r>>1;pushdown(x,l,r);if (l1<=mid) ins(tr[x].left,l,mid,l1,r1);
if (r1>mid) ins(tr[x].right,mid+1,r,l1,r1);
tr[x].s=tr[tr[x].left].s+tr[tr[x].right].s;
}inline void insert1(int
x,int l,int r,int p,int l1,int r1)
inline ll query(int &x,int l,int r,int l1,int r1)
inline int qk(int
x,int l,int r,int k,int l1,int r1)
int main()sort(a1+1,a1+nn+1);nn=unique(a1+1,a1+nn+1)-a1-1;build(root,1,nn);
for (int i=1;i<=m;++i)
if (qr[i].op==2) printf("%d\n",a1[qk(root,1,nn,qr[i].c,qr[i].a,qr[i].b)]);
}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的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...