並不是一道很無聊的題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的數字 可能選的數不在棋盤上 把它們出現在棋盤上的方格塗黑...