Tyvj p3070 動態排名 (動態區間第K大)

2021-07-02 14:39:37 字數 2294 閱讀 1070

題目鏈結

動態排名系統 20

[問題描述]

給定乙個長度為 n 的已知序列 a[i](1<=i<=n),要求維護這個序列,能夠支援以下兩種操作:

1、查詢 a[i],a[i+1],a[i+2],...,a[j](1<=i<=j<=n)中,公升序排列後排名第 k 的數。

2、修改 a[i]的值為 j。

所謂排名第 k,指一些數按照公升序排列後,第 k 位的數。例如序列,排名第 3 的數

是 6,排名第 5 的數是 9。

[輸入格式]

第一行包含乙個整數 d(0<=d<=4),表示測試資料的數目。接下來有 d 組測試資料,每組測

試資料中,首先是兩個整數 n(1<=n<=50000),m(1<=m<=10000),表示序列的長度為 n,有 m

個操作。接下來的 n 個不大於 1,000,000,000 正整數,第 i 個表示序列 a[i]的初始值。然後的

m 行,每行為乙個操作

q i j k 或者

c i j

分別表示查詢 a[i],a[i+1],a[i+2],...,a[j](1<=i<=j<=n)中,公升序排列後排名第 k 的數,和修改 a[i]

的值為 j。

[輸出格式]

對於每個查詢,輸出一行整數,為查詢的結果。測試資料之間不應有空行。

題解:方法很多,可用可持久化資料結構來做。

暫時只會線段樹套平衡樹+二分的方法,複雜度o(n*lgn*lgn*lgn)。

**如下:

#include#include#include#include#include#include#define nn 50010

#define mod 100003

typedef long long ll;

typedef unsigned long long llu;

using namespace std;

struct node

;void update(node *id)

}}void rotate(node* &id,int d)

void insert(node* &id,int val)

if(id->val==val)

else if(valval)

}else

}}void delete(node* &id,int val)

else if(id->son[1]==null)

else if(id->son[0]->keyson[1]->key)

else

}else

}else if(valval)

delete(id->son[0],val);

else

delete(id->son[1],val);

update(id);

}int ask(node* id,int val,pair&tem)

else if(id->val==tem.first)

return ask(id->son[0],val,tem);//???

}else

}void clear(node* id)

node* stree[132000];

int n,m,a[nn];

void build(int id,int l,int r)

void change(int id,int l,int r,int wei,int val)

int mid=(l+r)/2;

if(wei<=mid)

change(2*id,l,mid,wei,val);

else

change(2*id+1,mid+1,r,wei,val);

}int ve[nn],lv;

void check(int id,int l,int r,int l,int r)

int mid=(l+r)/2;

if(l<=mid)

check(2*id,l,mid,l,r);

if(r>mid)

check(2*id+1,mid+1,r,l,r);

}int solve(int l,int r,int k)

{ int i=0;

int j=1000000000;

int mid;

pairtem;

int ix,e;

lv=0;

check(1,1,n,l,r);

while(i<=j)

{tem=make_pair(1000000001,-1);

mid=(i+j)/2;

ix=0;

for(e=0;e

主席樹 動態區間第k小

模板題在這裡洛谷2617。閱讀本文需要有主席樹的基礎,也就是通過區間kth的模板題。靜態整體kth sort一下找第k小,時間複雜度 o nlogn 動態整體kth 權值線段樹維護一下,時間複雜度 o nlogn 靜態區間kth 主席樹維護,時間複雜度 o nlogn 動態區間kth 就是本次的標題...

tyvj P1014 懲罰遊戲 區間動態規劃

乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是 10 1 50...

動態區間第K大 樹狀陣列 主席樹

很早以前做靜態第k大的時候聽到要用樹套樹就過於害怕逃走了,現在用分塊暴力過了之後又想用樹套樹a一遍,於是就寫了一下 starkmal的線段樹 splay常數卡出翔惹 prag ma gcc optimize o3 include include include include include inc...