IOI2018 werewolf狼人 題解

2021-09-18 04:28:53 字數 3140 閱讀 8519

傳送門

由於loj真的很慢(不知道是loj的問題還是我電腦的問題),這裡提供洛谷的傳送門,**是完整**而不是互動**

從s

ss出發,只經過編號大於等於l

ll的點,能夠到達的所有點構成的集合記為aaa;

從e

ee出發,只經過編號小於等於r

rr的點,能夠到達的所有點構成的集合記為bbb,

那麼就是要求a∩b

a\cap b

a∩b是否為空集。

自然想到kruskal重構樹,先對每條邊以兩個端點的編號較小值為權值生成最大生成樹對應的重構樹tsts

ts,再對每條邊以端點編號較大值為權值生成最小生成樹對應的重構樹tete

te那麼在tsts

ts上倍增地往上跳,找到結點x

xx,滿足:以x

xx為根的子樹中的所有葉節點(也就對應到原圖中的結點)編號都大於等於l

ll,並且x

xx是深度盡可能小的那個點。在tete

te上也倍增往上跳,找到y

yy,滿足:以y

yy為根的子樹中的所有葉節點編號都小於等於r

rr,並且y

yy是深度盡可能小的那個點。

那麼t sts

ts中以x

xx為根的子樹的所有葉節點就構成了集合a

aa,tete

te中以y

yy為根的子樹的所有葉節點就構成了集合b

bb,現在要求它們的交集。考慮求出兩棵樹的dfs序,於是就變成了兩個序列,每次給出兩個區間,求交集。帶修改版:cf1093e。上資料結構維護就行了。可以離線樹狀陣列,但是我這種懶人當然是用主席樹了

#include

#include

#include

#include

template

<

typename t>

inline

void

read

(t &x)

template

<

typename t,

typename..

. args>

inline

void

read

(t &x, args &..

.args)

template

<

typename t>

void

write

(t x)

template

<

typename t>

inline

void

writeln

(t x)

template

<

typename t>

inline

bool

chkmin

(t &x,

const t &y)

template

<

typename t>

inline

bool

chkmax

(t &x,

const t &y)

const

int maxn =

2e5+

207, maxm =

4e5+

207, inf = int_max;

struct edge

edge()

:x(0

),y(

0)};

edge e[maxm]

;int n, m, q;

struct tree

void

dfs(

int x)

else st[x]

= xys +1;

for(

int i =

1; i <=20;

++i)

fa[i]

[x]= fa[i -1]

[fa[i -1]

[x]]

;for

(int i = head[x]

; i; i = next[i]

) ed[x]

= xys;

}int

find_s

(int x,

int ll)

intfind_e

(int x,

int rr)};

tree ts, te;

inline

bool

cmpmin

(const edge &a,

const edge &b)

inline

bool

cmpmax

(const edge &a,

const edge &b)

struct ufs

intfindf

(int x)};

inline

void

kruskal

(tree &t,

int tp)

} t.

dfs(node);}

struct ctree_node };

int p[maxn]

;struct chairman_tree

intquery

(int lt,

int rt,

int lb,

int rb,

int l,

int r)};

chairman_tree ct;

intmain()

kruskal

(ts,1)

;kruskal

(te,2)

; te.value[0]

= inf;

for(

int i =

1; i <= n;

++i) p[ts.dfn[i]

]= i;

ct.root[0]

=0;for

(int i =

1; i <= n;

++i)

for(

int i =

1; i <= q;

++i)

return0;

}

IOI2018 機械娃娃

看到的時候感到很不可做,因為所有的開關都要狀態歸零。因此可以得到兩分的好成績。然後 yhx 12243 說 這不是線段樹優化建圖嗎?於是我獲得了啟發,會做了 還不是和上次一樣,通過提示做出這種互動題的?我還是太菜了 以下魔改自我的思考過程 一開始想對每乙個觸發器配一組開關決策下一步,然後聽說用線段樹...

IOI2018 組合動作

題目 我是垃圾 最開始覺得可以三次問出第一位,之後還有 n 1 位和 n 1 次詢問,只需要一次確定一位就好了 之後就發現我是垃圾,上來直接press ab 如果不是 0 那麼首位就是 a 或 b 否則就是 x 或 y 之後再問一次就好了 之後我們需要用 n 次確定 n 1 位,於是就開始大躍進了 ...

IOI2018 組合動作 題解

傳送門 loj2863 果然簽到題就是好玩 首先我們可以猜2次來猜出第乙個字元是什麼,後面的串就和這個字元沒關係了。假設剩下的三個字元是tmp 0 tmp 1 tmp 2 目前已知答案串的長度為i 1 i 1i 1的字首是ans。考慮第i ii位 i n 1 i leq n 1 i n 1 我們可以...