CF487E Tourists(園方樹 樹鏈剖分)

2022-05-27 13:15:10 字數 2529 閱讀 5276

園方樹+樹鏈剖分

這題首先容易得到的性質是,乙個點雙內的所有點互相到達,這就說明這個點雙的答案就是他們中的最小值,因此建立園方樹。方點就維護了最值

現在有修改問題,對於乙個圓點的修改,勢必要影響到方點,我們對每個方點維護乙個multiset,這樣對於每個圓點的修改,都是對他的父親方點進行修改,這樣可以維護單點權值

那麼查詢的時候,因為是一段路徑,因此考慮樹鏈剖分後查詢,唯一有乙個特殊點就是,當他們的lca是方點,那麼這個方點的父親圓點資訊也可能影響方案,這裡注意一下即可。

這道題演算法比較明顯,就是模板多。

#includeusing

namespace

std;

typedef

long

long

ll;const

int n=4e5+10

;const

int mod=1e9+7

;const

int inf=0x3f3f3f3f

;int

h[n],e[n],ne[n],idx;

intdfn[n],ins[n],low[n],w[n],times;

intdepth[n],fa[n],id[n],top[n],son[n],sz[n];

stack

st;vector

g[n];

multiset

m1[n];

intvis[n];

intcnt;

intn,m;

struct

nodetr[n

<<2

];void add(int a,int

b)void tarjan(int

u) g[cnt].push_back(u);

g[u].push_back(cnt);}}

else

if(v!=fa[u])

}}void dfs1(int u,int

ff) }

}void dfs2(int u,intx)}

void pushup(int

u)void build(int u,int l,int

r); }

else

;

int mid=l+r>>1

; build(u

<<1

,l,mid);

build(u

<<1|1,mid+1

,r);

pushup(u);

}}void modify(int u,int l,int

x)

int mid=tr[u].l+tr[u].r>>1

;

if(l<=mid)

modify(u

<<1

,l,x);

else

modify(u

<<1|1

,l,x);

pushup(u);

}int query(int u,int l,int

r)

int mid=tr[u].r+tr[u].l>>1

;

int res=inf;

if(l<=mid)

res=query(u<<1

,l,r);

if(r>mid)

res=min(res,query(u<<1|1

,l,r));

return

res;

}int pathquery(int x,int

y)

if(depth[x]>depth[y])

swap(x,y);

res=min(res,query(1

,dfn[x],dfn[y]));

if(x>n)

return

res;

}int

main()

tarjan(1);

times=0

; depth[

1]=1

; dfs1(

1,0);

memset(vis,

0,sizeof

vis);

dfs2(

1,1);

for(i=2;i<=n;i++)

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

build(

1,1,cnt);

while(q--)

m1[fa[x]-n].erase(m1[fa[x]-n].lower_bound(w[x]));

m1[fa[x]-n].insert(tmp);

w[x]=tmp;

if(*m1[fa[x]-n].begin()==w[fa[x]])

int pos=*m1[fa[x]-n].begin();

w[fa[x]]=pos;

modify(

1,dfn[fa[x]],pos);

}else}}

view code

CF刷題總結 CF706E鍊錶

這題目應該要秒做出來的。首先看到二維,又沒什麼思路就直接降維 考慮一維的情況,就是一段連續的和另一端連續的交換,最快的當然是鍊錶模擬了。所以考慮到二維中也不應該用陣列儲存,而是鍊錶表示。但是由於二維的話,不可能是簡單的鍊錶。所以考慮每乙個矩形和旁邊的關係。肯定就是四周的,但是只考慮單向,那就是2個方...

CF508E 貪心 搜尋 構造

題目大意 讓你構造乙個括號序列,括號匹配的方式類似於棧,給出從左數每個括號 到和它匹配的右括號的 最小和最大距離,讓你輸出乙個合法括號序列 看錯題了以為是二分圖,然後寫了搜尋 貪心發現如果距離往小了填,不會影響結果 括號必須套完整的括號,所以距離必須是2的整數倍 1 如果乙個括號匹配上了,那麼兩個括...

CF149E 字尾自動機

題意 給出乙個長字串s和一組詢問字串,對於每個詢問需要知道在s中是否存在兩個位置不同的子串可以組成該詢問字串。建s的字尾自動機,同時處理出每個狀態出現的最左位置和最右的位置。拿每乙個詢問和s的自動機匹配,記錄下詢問串中以每個位置為結尾所匹配的長度和匹配自動機中哪個狀態。設l為整個詢問串所能匹配的長度...