洛谷P3960 列隊 splay

2022-08-16 17:42:11 字數 947 閱讀 9028

觀察到向左看齊和向前看齊真正影響的是當前行第y列和當前行的最後乙個人,於是每行除最後乙個建乙個splay,最後一列單獨建乙個splay。

對於每次操作,刪除第x個splay樹的第y個,將最後一列的第x個(即第x行最後一列)加入第x個splay樹的末尾,再將刪除的那個節點加入最後一列的splay樹的末尾。

// luogu-judger-enable-o2

#include#include#include#includeusing namespace std;

const int maxn=3e6+10;

typedef long long ll;

int n,m,q;

int fa[maxn],ch[maxn][2],cnt;

ll l[maxn],r[maxn],size[maxn];

int read()

while(isdigit(ch))

return x*f;

}struct splay

void build(ll l,ll r)

void update(int x)

void rotate(int x)

void splay(int x)

root=x;

}int splitnode(int x,ll k)

else

splay(u);

return u;

}ll kth(ll k)

else}}

splay(u);

fa[ch[u][0]]=fa[ch[u][1]]=0;

if(!ch[u][0]) root=ch[u][1];

else

return l[u];

}void insert(ll x)

}}t[maxn];

int main()

}

洛谷P3960 列隊(Splay)

傳送門 感覺自己好久不打資料結構已經完全不會了orz 據說正解樹狀陣列?然而並不會 首先考慮一下每一次操作,就是把乙個人從這一行中取出並放到行的最後,再從最後一列取出放到列的最後 那麼這兩種操作其實可以看做同乙個型別,都是把某乙個數取出並放到最後 那麼這個可以用splay來搞,用splay維護區間,...

題解 P3960 列隊

考慮到每個點都是先橫向移動,然後再縱向移動,所以我們可以考慮每行維護乙個splay,最後一列再維護乙個splay。但是考慮到n和m的規模都是 3 10 5 級別的,普通的splay肯定會爆空間,所以我們使用動態開點的splay,對於每個節點記錄乙個l和乙個r,如果需要splay的元素在這個區間當中,...

題解 P3960 列隊

考慮到每個點都是先橫向移動,然後再縱向移動,所以我們可以考慮每行維護乙個splay,最後一列再維護乙個splay。但是考慮到n和m的規模都是 3 10 5 級別的,普通的splay肯定會爆空間,所以我們使用動態開點的splay,對於每個節點記錄乙個l和乙個r,如果需要splay的元素在這個區間當中,...