題目鏈結
動態排名系統 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...