洛谷 P3960 列隊 線段樹動態開點

2021-09-28 11:17:26 字數 892 閱讀 3048

題意: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樹的末尾...