CF983E NN country(倍增,差分)

2022-05-19 21:31:26 字數 2378 閱讀 7761

給定一棵樹和若干條路線,每條路線相當於樹上 x,y 之間的路徑,途徑路徑上的每個點

給出若干個詢問,每次詢問從 u 到 v 至少需要利用幾條路線

n,m,q≤200000

構建倍增陣列g[i][j]表示從i點向上經過j條線路能到達的深度最小的點。

所以對於每一對詢問的x,y,我們貪心地把它們提到深度大於等於lca地最大的點。記為x『,y'然後判斷是否有路徑經過x』和y『

然後各種情況特判(無解,x『,y』為lca,有無路徑經過x『,y』)

然後對於判斷是否路徑經過x『,y』。

可以用樹狀陣列維護 dfs 序

dfs 遍歷整棵樹,遞迴進入 x 時,掃瞄路線 (x,y),把 y 在 dfs 序上對應位置 +1,

x,y 可直達,當且僅當 x 子樹中的節點使 dfs 序上 y 對應區間的和發生了變化

(調了半天**最後沒調出來,最後屈辱地看了題解)

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

using

namespace

std;

8const

int n=200005;9

const

int d=30;10

struct

node;

13 vectorroad[n],h[n];

14 vectorq[n];

15int n,m,t,fa[n][d+1],w[n][d+1

],head[n],sum[n],ans[n],g[n];

16int

cnt,tot,dep[n],id[n],size[n],c[n];

17int lowbit(int

x)20

void update(int

x)24}25

int check(int

x)30

return

tmp;31}

32struct

edgee[n*2

];35

void add(int u,int

v)41

void dfs1(int u,int

deep)51}

52void dfs2(int

u)59

for(int i=head[u];i;i=e[i].nxt)

66 w[u][0]=g[u];67}

68int lca(int x,int

y)73

if(x==y)return

x;74

for(int i=d;i>=0;i--)

77return fa[x][0

];78

}79 node work(int x,int

lca);

81int tmp=0;82

for(int i=d;i>=0;i--)

83if(dep[w[x][i]]>dep[lca])x=w[x][i],tmp+=(1

<

84if(w[x][0]==x)return (node);

85return

(node);86}

87int

main()

94 dfs1(1,1

);95

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

96for(int j=1;j<=n;j++)

99 scanf("

%d",&m);

100for(int i=1;i<=m;i++)

110 dfs2(1

);111

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

114for(int i=1;i<=d;i++)

115for(int j=1;j<=n;j++)

119 scanf("

%d",&t);

120for(int i=1;i<=t;i++)

130if(x==c||y==c)

134 ans[i]=a.b+b.b+2

;135 x=a.a;

136 y=b.a;

137if(id[x]>id[y])swap(x,y);

138 q[id[x]-1].push_back((node));

139 q[id[x]+size[x]-1

].push_back((node));

140}

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

148}

149for(int i=1;i<=t;i++)

152return0;

153 }

view code

CF983C elevator 記憶化搜尋

題面來自luogu 乙個9層的樓有乙個可以容納4個人的電梯,你要管理這個電梯。現在各層樓上有一些在排隊的人,你知道他們在哪層要到哪層去。你也知道到電梯門口的順序。根據公司的規定,如果乙個人比其他人早到。他也必須先進電梯 無論樓層,只憑時間 注意人們可以隨時離開電梯。電梯有兩個命令 最初電梯是空的,在...

CF刷題總結 CF706E鍊錶

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

CF508E 貪心 搜尋 構造

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