帶修改區間k大

2021-07-14 11:36:40 字數 803 閱讀 4219

看了好久,後來自己想了一下。大概就是說因為原來的寫法下要修改的代價太大了,所以套上乙個樹狀陣列使每顆主席樹存特定幾個位置上的權值。平均一下修改和詢問的代價。

#include#include#include#define n 2200001

using namespace std;

int n,m,tot,top,sz;

int v[10001],num[20001],hash[20001];

int flag[10001],a[10001],b[10001],k[10001],root[10001];

int sum[n],ls[n],rs[n];

int l[30],r[30],a,b;

int lowbit(int x)

int find(int x)

int query(int l,int r,int k)

else

}int main()

for(int i=1;i<=m;i++)

else num[++top]=b[i];

}sort(num+1,num+top+1);

hash[++tot]=num[1];

for(int i=2;i<=top;i++)

if(num[i]!=num[i-1])

hash[++tot]=num[i];

for(int i=1;i<=n;i++)

for(int i=1;i<=m;i++)

if(flag[i])

else

return 0;

}

樹狀陣列套主席樹 帶修改區間K大數

題目描述 給定乙個含有n個數的序列a 1 a 2 a 3 a n 程式必須回答這樣的詢問 對於給定的i,j,k,在a i a i 1 a i 2 a j 中第k小的數是多少 1 k j i 1 並且,你可以改變一些a i 的值,改變後,程式還能針對改變後的a繼續回答上面的問題。你需要編乙個這樣的程式...

區間修改 區間查詢模板

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下 操作1 ...

可修改區間k th number

這個眾所周知了。可以用主席樹實現。具體的話其實就是開 n 棵權值線段樹,動態開節點,由於每次增加乙個點最多隻會新建lo g2n個點,所以空間複雜度為o nlog 2n 我們在權值線段樹上記錄該範圍數的出現次數,然後可以發現查詢的兩個區間端點的線段樹資訊可以相減,於是就可以線段樹上二分了。時間複雜度o...