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