bzoj3110 Zjoi2013 K大數查詢

2021-08-15 22:26:48 字數 2153 閱讀 5019

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