bzoj3946 無聊的遊戲

2022-02-05 03:55:13 字數 3204 閱讀 7693

並不是一道很無聊的題2333

給定n個串,支援:

1.區間在最前面壓入乙個串

2.區間求lcp

n<=50000,sum<=600000

%%yjc

區間壓串,,??

先考慮區間求lcp,相鄰lcp最小值!

故維護區間height最小值mh

區間壓串?

對於[l+1,r]mh都加上len

l,r+1要hei不知道怎麼變

必須重新找lcp

必須知道原串具體情況

lcp還要修改,hash+二分!

考慮,給整個區間打上乙個串的標記。。。

下放?直接複製gg

標記永久化?有先後,不能合併!

還是下放?不能直接複製?可持久化!

可持久化線段樹?merge複雜度感覺不太對,且空間太大

可持久化平衡樹?可持久化平衡樹!

fhq-treap可持久化一下,外層二分mid

內層找hash值:

wrk0,wrk1在邊界時候特殊討論

**:

#include#define reg register int

#define il inline

#define fi first

#define se second

#define mk(a,b) make_pair(a,b)

#define numb (ch^'0')

#define uint unsigned int

#define mid ((l+r)>>1)

using

namespace

std;

typedef

long

long

ll;template

il void rd(t &x)

template

il void output(t x)

template

il void ot(t x)

template

il void prt(t a,int st,int nd)

namespace

miraclet[

18000000+5

];int

tpc;

int nc(char

v)int

sta[m],top;

void up(int

x)void dfs(int

x)int

cons()

ret=sta[1

];//

cout<

//cout<

ret;

}int merge(int x,int

y)else

up(now);

return

now;

}uint calc(int x,intk)}

int lcp(int x,int y)

return

ret;

}#define oooooooooooooooooooooooooooooooooooooooooooooo segmenttree

int rt[2*n];

int ls[2*n],rs[2*n];

int mh[2*n],tag[2*n];

intseg[n];

intsgc;

void pushup(int

x)void pushdown(int x,int l,int

r)

if(rt[x])

}void pd(intx)}

void build(int x,int l,int

r) ls[x]=++sgc;rs[x]=++sgc;

build(ls[x],l,mid);build(rs[x],mid+1

,r);

pushup(x);

}int getrt(int x,int l,int r,int

p) pushdown(x,l,r);

if(p<=mid) return

getrt(ls[x],l,mid,p);

else

return getrt(rs[x],mid+1

,r,p);

}void fhq(int x,int l,int r,int l,int r,int

nrt)

if(l<=mid) fhq(ls[x],l,mid,l,r,nrt);

if(mid1

,r,l,r,nrt);

}void add(int x,int l,int r,int l,int r,int c)

pd(x);

if(l<=mid) add(ls[x],l,mid,l,r,c);

if(mid1

,r,l,r,c);

pushup(x);

}void chan(int x,int l,int r,int p,int c)

pd(x);

if(p<=mid) chan(ls[x],l,mid,p,c);

else chan(rs[x],mid+1

,r,p,c);

pushup(x);

}int qmin(int x,int l,int r,int l,int

r) pd(x);

int ret=inf;

if(l<=mid) ret=min(ret,qmin(ls[x],l,mid,l,r));

if(mid1

,r,l,r));

return

ret;

}void wrk0(int l,int r)

if(r!=n)

}int wrk1(int l,int r)

else

}int

main()

++sgc;

//cout<

,n);

char op[233

];

intl,r;

while(m--)

else

}return0;

}}signed main()

/*author: *miracle*

date: 2019/3/16 17:03:13

*/

區間標記還能這麼打?

單個標記直接打

樹套樹標記永久化

但是可以有時可以用可持久化資料結構當做標記!時間空間多了乙個logn而已

BZOJ3946 無聊的遊戲

首先把所有串拼起來,後插入的串在前面,得到乙個大串。那麼任意時刻,每個串是由這個大串的若干個不相交的子串從左到右拼接而成。用線段樹維護每個串,每個節點維護乙個標記,表示區間內的串要加上什麼字首。用可持久化線段樹維護這些串和標記,那麼合併就是線段樹的合併,因為取值區間互不相交,所以每次合併的複雜度為 ...

A 無聊的遊戲

應該是博弈論 但我還沒學 這題有點水。n m a b 1 n是m的倍數 那麼這種情況下取的人贏了 2 接下來我們考慮一下走到哪部就穩操勝券了 首先你必須取 m個或者大於m並且是m的倍數,那麼我們考慮2m個特殊邊界,n 2m 舉個例子n 2.5m 我只要取到1.5m 換你取 1.5m m 你必須要取m...

JZOJ 3871 無聊的遊戲

學校的運動會開始了,體能很菜的小可可沒報任何比賽專案,於是和同學們玩乙個十分無聊的遊戲。遊戲在乙個由n n個方格組成的正方形棋盤上進行,首先在每個方格上均勻隨機地填入1到m之間的正整數 每個方格填的數均不同 然後小可可均勻隨機地選出k個1到m的數字 可能選的數不在棋盤上 把它們出現在棋盤上的方格塗黑...