loj3176 景點劃分

2022-06-07 11:24:07 字數 1612 閱讀 3287

不妨設$a\le b\le c$,那麼相當於要找到兩個大小至少為$a$和$b$的連通塊(連通塊可以通過刪除度最小的點變小)

以乙個點為根建出dfs樹並對以下情況分類討論:

1.存在乙個節點滿足$\max(\max_(sz[son]),n-sz[k]+s)2.不存在,那麼必然有解,且可以通過以下方法構造:

(1)找到任意乙個滿足$sz[k]\ge a$且$\max_(sz[son])(2)若$n-sz[k]+s\ge b$,將在$k$子樹中且刪去$k$後無法與根聯通的$x$加入$s_$,對於剩下的子樹不斷加入$s_$直到$s_$大小不小於$a$,然後剩下的點歸入$s_$

由於$\max_(sz[son])(3)若$n-sz[k]+s\lceil \frac\rceil+s>b$,同時$n-sz[k]+s\ge a$(否則無解),那麼交換$a$和$b$後用同樣的方法即可

(**中有一些小問題,可以通過隨機根解決qaq)

1 #include2

using

namespace

std;

3#define n 100005

4struct

jiedge[n<<2

];7 paira[11];8

inte,r,n,m,x,y,flag,head[n],sz[n],dfn[n],low[n],tot[n],ans[n];

9void add(int x,int

y)14

void update(int k,int

p)21

void dfs(int k,int

fa)33

else

37if ((mx1].first)&&(sz[k]>=a[1

].first))

43if (n-sz[k]+s2].first)swap(a[1],a[2

]);44 ans[k]=a[1

].second;

45 a[1].first--;

46for(int i=head[k];i!=-1;i=edge[i].nex)

47if ((edge[i].to)&&(low[edge[i].to]>=dfn[k]))update(edge[i].to,1

);48

for(int i=head[k];i!=-1;i=edge[i].nex)

49if ((edge[i].to)&&(low[edge[i].to]1

);50 update(r,2

);51

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

52if (!ans[i])ans[i]=a[3

].second;53}

54}55int

main()

63 sort(a+1,a+4

);64 memset(head,-1,sizeof

(head));

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

70 dfs(r,0

);71

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

%d "

,ans[i]);

72 }

view code

3 17學習計畫

1 做一套計算機二級的題目 2 背英語單詞,記筆記 4 做模電作業,課堂檢測和課後作業 1 和往常一樣,空閒的時候,在手機上做了選擇題 有電腦的時候,直接做大題。做了很多題目之後,現在對word算是比較熟悉了,基本上首先是要看是另存為,還是以什麼名字儲存。其次基本上都要調整頁面大小,頁邊距這些。當然...

3 17考試小記

考場上來讀完第一題第一反應就是網路流,看上去應該是乙個最小割或者費用流。第二題看上去好像是一道傳統計數題,可能要n 2遞推 組合數或者容斥可能會很麻煩。第三題題面很長,讀完發現就是一道lct維護子樹資訊,而且細節很多,很毒瘤。但是部分分給的很多,但是種類有點多,貌似每乙個部分分都不那麼好打,而且最後...

藍橋杯練習 3 17

旅行家的預算 貪心 問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,...