最近很對勁的太刀流做的一道題中說樹是無向連通無環圖,並不對勁的片手流為了反駁他,決定與之針鋒相對,就練線段無向連通無環圖套平衡無向連通無環圖的題。
很對勁的太刀流->
題意非常簡單,就是維護乙個資料結構,支援區間排名、區間第k大、單點修改、區間前驅後繼這些操作。
主席樹+樹狀陣列想必是可以做的,但是並不對勁的人並不想開權值線段樹,於是就選擇了這種常數極大的做法。
需要注意的是,並不能直接找到區間內排在第k位的數。要二分出答案,然後判斷解的排名是否對勁。答案是符合條件的的最大值(因為有的對勁的數並沒有出現在數列裡)。
並不覺得有什麼好說的。
可以去洛谷的模板題提交->
#include#include並不對勁#include
#include
#include
#include
#include
#define maxn 5000010
#define ls son[u][0]
#define rs son[u][1]
#define rks son[rk][0]
#define m (l+r>>1)
#define s0 siz[0]=0
#define ls (n<<1)
#define rs (n<<1|1)
#define inf 2147483647
#define rep(i,x,y) for(register int i=(x);i<=(y);i++)
#define dwn(i,x,y) for(register int i=(x);i>=(y);i--)
using
namespace
std;
inline
intread()
inline
void write(int
x)
if(x<0)
while(x)ch[++f]=x%10+'
0',x/=10
;
while(f)putchar(ch[f--]);
putchar('\n
');}int rt[maxn],fa[maxn],son[maxn][3
],key[maxn],num[maxn],siz[maxn],a[maxn],cnt,nn,x,y,rank;
inline
void pu(int u)
inline
int res(int k,int f)
inline
int getso(int u)
inline
void rot(int
u)inline
void splay(int u,int k,int
pla)
if(!k)rt[pla]=u;
}inline
void fnd(int k,int
pla)
inline
int nxt(int k,int f,int
pla)
inline
void ins(int k,int
pla)
inline
void sgtr(int n,int l,int
r)inline
int rnk(int k,int
pla)
if(key[u]rs;
else u=ls;
}return rank-1;}
inline
void del(int k,int
pla)
inline
int _1(int n,int l,int r,int
k)inline
int _2(int
k)
return l-1;}
inline
void _3(int n,int l,int r,int
k)inline
int _4(int n,int l,int r,int
k)inline
int _5(int n,int l,int r,int
k)int
main()
return0;
}
不寫splay這種常數極大的平衡無向連通無環圖就不用開o2了。
據說拼命卡常能過。
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的費用流
最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...
並不對勁的字尾陣列
字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...