BZOJ3110 Zjoi2013 K大數查詢

2022-05-12 03:22:56 字數 1808 閱讀 9429

time limit: 20 sec  memory limit: 512 mb

submit: 1190  solved: 568

[submit][status]

有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

1n,m<=50000,n,m<=50000

a<=b<=n

1操作中abs(c)<=n

2操作中abs(c)<=maxlongint

題解:線段樹套線段樹,一旦要動態開點就得傳一大堆引數,幸好改了乙個sb錯誤之後就a了。。。

外層為權值線段樹,內層為區間線段樹。

自己想一下基本上就知道是怎麼回事兒了。。。

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11

#define inf 1000000000

12#define maxn 50000+1000

13#define maxm 500+100

14#define eps 1e-10

15#define ll long long

16#define pa pair17

using

namespace

std;

18 inline int

read()

1922

while(ch>='

0'&&ch<='9')

23return x*f;24}

25struct seg1t[300*maxn];

26struct seg2tt[4*maxn];

27int

n,m,tot;

28void pushup(int

k)29

32void update(int &k,int l,int r,int

z)33

38void pushdown(int k,int l,int

r)39

45void add(int &k,int l,int r,int x,int

y)46

50pushdown(k,l,r);

51if(y<=mid)add(t[k].lc,l,mid,x,y);

52else

if (x>mid)add(t[k].rc,mid+1

,r,x,y);

53else

5457

pushup(k);58}

59 ll getsum(int k,int l,int r,int x,int

y)60

69void build(int k,int x,int

y)70

75void change(int k,int x,int y,int

z)76

82int query(int k,int x,int y,int

z)83

90int

main()

91101

return0;

102 }

view code

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