LOJ P3960 列隊 樹狀陣列 vector

2022-05-25 14:12:08 字數 1205 閱讀 1858

樹狀陣列預處理之後直接搞就可以了,也不是很好解釋,反正就是乙個模擬過程的暴力用樹狀陣列維護,還挺巧妙的。

我為什麼考場上想不出來嚶嚶嚶

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn=600010;9

intn,m,q;

10int xx[maxn]={},yy[maxn]={};

11int num[maxn]={},z[maxn]={};

12int lag[maxn]={};

13int t[maxn]={},mx;

14 vectorid[maxn];

15 vectorval[maxn];

16 vector

long >shu[maxn];

17void add(int x,int

v)22}23

int getit(int

x)return

tsn;29}

30int find(int

x)37

return

l;38}39

intmain()

48else

49 z[i]=1;50

}51for(int i=1;i<=mx;i++)add(i,1

);52

for(int i=1;i<=n;i++)

58for(int j=0;j1

);59}60

long

long

ans;

61for(int i=0;i<=n;i++)shu[0].push_back((long

long)i*m);

62 lag[0]=m;

63for(int i=1;i<=q;i++)

68else

if(num[i]<=m+lag[xx[i]]-1)74

else

78 shu[0].push_back(ans);lag[0]++;

79 printf("

%lld\n

",ans);80}

81return0;

82 }

view code

題解 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的元素在這個區間當中,...

NOIP2017 列隊(樹狀陣列)

定義第i行為所有的點 i,j 0 可以發現,每一行是相對獨立的,每一次操作只會影響到當前行和最後一列 考慮每一行和最後一列各開乙個樹狀陣列,但這樣顯然會爆空間 實際上,對於沒有離隊過的點是沒必要儲存的,可以直接算出編號,因此只要用vector儲存每一行和最後一列後加入的點即可 還需要預處理乙個陣列d...