這道題的解法挺多,值域線段樹套區間線段樹,區間線段樹套值域線段樹(目前想到的是zkw的標記永久化),cdq分治
相對好寫一點的就是維護差分主席樹,每個位置維護與前乙個位置的數集差分,修改就可以看做是單點修改,然後再反推字首和
#include #include #include #include #include const long long oo=1ll<<50;
using namespace std;
int l[2][5000000],st[2][5000000][2],r[2][5000000];
long long sum[2][5000000];
int ss[2],n,m,root[2][5000000];
int ori(int e)
void change(int e,int x,long long l,long long r,long long c,int w)
long long mid=(l+r)>>1;
if (c<=mid)
else
sum[e][x]=sum[e][l[e][x]]+sum[e][r[e][x]];
}void origin()
int lowbit(int x)
void modify(int x,int c,int w)
long long ask(int e,int t,int k)
void lstep(int e,int t)
void rstep(int e,int t)
long long query(int l,int r,int k)
; for (int x=l-1;x;x-=lowbit(x))
st[0][++t[0]][0]=root[0][x],
st[0][t[0]][1]=root[1][x];
for (int x=r;x;x-=lowbit(x))
st[1][++t[1]][0]=root[0][x],
st[1][t[1]][1]=root[1][x];
long long l=1,r=oo+oo;
for (;l!=r;)
else
}return l;
}int main()
else
}return 0;
}
ZJOI2013 K大數查詢
有n個位置,m個操作。1 a b c形式,表示在第a個位置到第b個位置,每個位置加入乙個數c 2 a b c形式,表示詢問從第a個位置到第b個位置,第c大的數是多少。區間的第k大值有一種二分的做法。二分答案mid,計算出區間內 mid的值有多少個。若數量小於c,則ans mid,否則ans mid。...
ZJOI2013 K大數查詢
有n個位置,m個操作。操作有兩種,每次操作如果是 2 a b c 表示詢問從第a個位置到第b個位置,第c大的數是多少。輸入格式 第一行n,m接下來m行,每行形如1 a b c或2 a b c 輸出格式 輸出每個詢問的結果 solution 整體二分。假設我們現在要解決 ql,qr 並且他們的答案 加...
ZJOI2013 K大數查詢
點此看題 0x01 樹套樹 這道題的思路特別巧妙,樹套樹不一定要用區間線段樹套權值線段樹,還可以反過來套。我們維護乙個動態開點的權值線段樹,每個點代表權值 l,r l,r l,r 在整個區間的出現情況,套上乙個動態開點的區間線段樹,操作1 11對權值線段樹單點修改,然後對每個點的 a,b a,b a...