觀察到向左看齊和向前看齊真正影響的是當前行第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的元素在這個區間當中,...