題意:n*m個人,每次從x,y出去乙個,第x行統一向左補位,第m列統一向前移位,每次輸出當前位置人的編號
思路:模擬過程很容易想到用線段樹或者bit維護+vector維護,但是不太行,於是學了動態開點,50行不壓行**。
**:
#include
using
namespace std;
#define ll long long
#define forn(i,n) for(int i=0;i#define for1(i,n) for(int i=1;i<=n;i++)
#define io ios::sync_with_stdio(false);cin.tie(0)
const
int maxn =
3e5+5;
int n,m,q,sz,l =
1,r =
6e5+
5,root[maxn]
;vectora[maxn]
;class
dsegment_tree
node[maxn*50]
;int
query
(int k,
int now,
int l = l,
int r = r)
void
update
(int pos,
int&now,
int l = l,
int r = r)
}tree;
ll dely
(int x,
bool flag)
ll delx
(int x,
int y)
intmain()
return0;
}
洛谷 P3960 列隊 線段樹動態開點
題意 n m個人,每次從x,y出去乙個,第x行統一向左補位,第m列統一向前移位,每次輸出當前位置人的編號 思路 模擬過程很容易想到用線段樹或者bit維護 vector維護,但是不太行,於是學了動態開點,50行不壓行 include using namespace std define ll long...
洛谷P3960 列隊(Splay)
傳送門 感覺自己好久不打資料結構已經完全不會了orz 據說正解樹狀陣列?然而並不會 首先考慮一下每一次操作,就是把乙個人從這一行中取出並放到行的最後,再從最後一列取出放到列的最後 那麼這兩種操作其實可以看做同乙個型別,都是把某乙個數取出並放到最後 那麼這個可以用splay來搞,用splay維護區間,...
洛谷P3960 列隊 splay
觀察到向左看齊和向前看齊真正影響的是當前行第y列和當前行的最後乙個人,於是每行除最後乙個建乙個splay,最後一列單獨建乙個splay。對於每次操作,刪除第x個splay樹的第y個,將最後一列的第x個 即第x行最後一列 加入第x個splay樹的末尾,再將刪除的那個節點加入最後一列的splay樹的末尾...