差分主席樹 zjoi2013 k大數

2021-09-30 11:37:19 字數 1189 閱讀 4658

這道題的解法挺多,值域線段樹套區間線段樹,區間線段樹套值域線段樹(目前想到的是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...