P4197 Peaks 解題報告

2021-10-25 15:01:46 字數 1790 閱讀 5431

p4197 peaks

看到「只經過困難值小於等於 x

xx 的路徑」這樣一句話,我們就知道了這題應該是考察 kruskal重構樹+樹上倍增。

於是建出kruskal重構樹,每次詢問就可以確定可以到達的點在哪個kruskal重構樹節點的子樹裡。預先跑乙個dfs,賦予葉子節點時間戳,使得任意乙個子樹中的所有葉子節點時間戳連續。然後就可以建立主席樹,接下來是經典做法了。

還有另乙個做法是離線後set啟發式合併,也可以通過本題。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

char in[

1<<20]

,*ss = in,

*tt = in;

#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)

ll read()

const

int maxn =

2e5+5;

const

int maxm =

1e6+5;

int upto[maxn]

, n, m, q, num, h[maxn]

, lsh[maxn]

, lsh_num, head[maxn]

, ver[maxn]

, nxt[maxn]

, cnt, fa[maxn][21

], val[maxn]

, dfn[maxn]

, bel[maxn]

, tim, st[maxn]

, sz[maxn]

, sgt[maxn]

;struct ed ed[maxm]

;bool

operator

<

(const ed& a,

const ed& b)

void

lsh(

)int

lsh(

int x)

intgetup

(int u)

void

addedge

(int u,

int v)

namespace sgt e[maxn <<5]

;int tot;

void

mdy(

int& p,

int pre,

int l,

int r,

int x)

intcalc

(int u,

int v)

intqry

(int u,

int v,

int l,

int r,

int k)

}void

kruskal()

for(

int i =

1; i <=

20; i++

)for

(int u =

1; u <= num; u++

) fa[u]

[i]= fa[fa[u]

[i-1]]

[i-1];

}void

dfs(

int u)

}int

main()

return0;

}

小P的單調區間 解題報告

題目鏈結 題目大意 給定乙個序列,選出若干個數,將其分成若干單調的子串行 可不連續 相鄰序列單調性不同,第乙個序列一定為單調遞增。求出所有方案中序列和的平均值的最大值。如3,7,9,2,4,5,把它劃分為 3,7,9 2,4 5 答案為 3 7 9 2 4 5 3 10。把它劃分為 3,9 5 答案...

洛谷P3372解題報告

題目描述如下 在這裡插入描述 由於是一道模板題就直接給注釋詳細的 include includeusing namespace std typedef long long ll long long int sum 0ll struct node tree 500005 void build ll l...

P1201高低位交換解題報告

name p1201高低位交換 author goal00001111 date 17 12 08 09 24 description 描述 description 給出乙個小於2 32的正整數。這個數可以用乙個32位的二進位制數表示 不足32位用0補足 我們稱這個二進位制數的前16位為 高位 後1...