**樹狀陣列與線段樹:
**\(splay\):
題目傳送門:
樹套樹模板題,外層用乙個位置線段樹,內層用乙個平衡樹即可解決。
查第\(k\)大是誰需要在外面套乙個二分。這題比較卡,反正我是勉勉強強跑過去的……
時間複雜度:\(o(nlog^3n)\)
空間複雜度:\(o(nlogn)\)
**如下:
#include #include using namespace std;
const int maxn=5e4+5,inf=2147483647;
int a[maxn];
int n,m,mn=1e9,mx=-1e9;
int read()
struct splay
int find(int rt,int v)
if(val[u]val[u]]=tot;splay(rt,tot);
}int get_rk(int &rt,int v)
void del(int &rt,int v)
if(!son[u][0])
if(!son[u][1])
int node=son[u][0];while(son[node][1])node=son[node][1];
fa[son[u][0]]=0;splay(rt,node);
son[node][1]=son[u][1];fa[son[u][1]]=node;
updata(node);
}int get_pre(int &rt,int v)
}s;struct segment_tree
int query_rk(int p,int l,int r,int l,int r,int v)
void change(int p,int l,int r,int pos,int v_before,int v_after)
int query_pre(int p,int l,int r,int l,int r,int v)
int query_suc(int p,int l,int r,int l,int r,int v)
}t;int main()
printf("%d\n",l);
}if(opt==3)t.change(1,1,n,pos,a[pos],k),a[pos]=k,mn=min(mn,k),mx=max(mx,k);
if(opt==4)printf("%d\n",t.query_pre(1,1,n,l,r,k));
if(opt==5)printf("%d\n",t.query_suc(1,1,n,l,r,k));
}return 0;
}
Bzoj3196 二逼平衡樹
您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...
BZOJ3196 二逼平衡樹
因為線段樹支援區間修改查詢,平衡樹支援查詢第k大,乙個數的排名,乙個數的前驅 後繼。所以選擇兩個資料結構套在一起。include include include using namespace std int n,m,sz,tmp int a 200005 root 200005 struct tr...
Bzoj3196 二逼平衡樹
您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...