BZOJ 1806 樹分塊 模板題

2021-08-23 12:19:53 字數 1526 閱讀 6907

time limit: 10 sec  memory limit: 162 mbsec  special judge

submit: 2685  solved: 1635

[submit][status][discuss]

「餘」人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成

員來管理。他的國家有n個城市,編號為1..n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條

直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個

城市。每個省必須有乙個省會,這個省會可以位於省內,也可以在該省外。但是該省的任意乙個城市到達省會所經

過的道路上的城市(除了最後乙個城市,即該省省會)都必須屬於該省。乙個城市可以作為多個省的省會。聰明的

你快幫幫這個國王吧!

第一行包含兩個數n,b(1<=n<=1000, 1 <= b <= n)。接下來n-1行,每行描述一條邊,包含兩個數,即這

條邊連線的兩個城市的編號。

如果無法滿足國王的要求,輸出0。否則輸出數k,表示你給出的劃分方案中省的個數,編號為1..k。第二行輸

出n個數,第i個數表示編號為i的城市屬於的省的編號,第三行輸出k個數,表示這k個省的省會的城市編號,如果

有多種方案,你可以輸出任意一種。

8 21 2

2 31 8

8 78 6

4 66 5

32 1 1 3 3 3 3 2

2 1 8

[submit][status][discuss]

思路: 樹分塊,我們可以貪心的dfs ,然後如果向下dfs 那麼我們記錄乙個相對棧底,回溯回來的時候如果個數》=b 那麼我們彈出棧頂到相對棧底的所有元素。分成一塊。 注意最後棧不一定為空。

還有要判斷一下,是否塊為0的情況,當然這個題不會有無解的情況,因為b《=n

**:

#includeusing namespace std;

typedef long long ll;

const int n =1e3+5;

vectorve[n];

int n,b;

int stk[n];

int top;

int fa[n];

int bel[n];

int tot;

void dfs(int u,int f)}}

stk[top++]=u;

}int main()

memset(bel,-1,sizeof(bel));

memset(fa,-1,sizeof(fa));

dfs(1,-1);

if(top!=0)

printf("%d\n",tot);

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

printf("%d",fa[1]);

for(int i=2;i<=tot;i++)

printf("\n");

return 0;

}

BZOJ1806 礦工配餐

也是一道不錯的題目呢!bzoj上面的題的確很好呢,可惜我到現在才開始刷。不可以再把暴力 騙分盡量拿省一然後就投入文化課作為目標了,一是因為運氣不一定那麼好,二是我又重新發現了oi的美。如果這次可以拿到省一,我決定和之前那位大神一樣,停課準備省選,哪怕這很難。此題又涉及dp狀態設計的另乙個技巧,或者說...

分塊模板 模板題

嗯 直接貼板子了,注釋寫了點 include using namespace std const int maxn 1e5 10 int a maxn belong maxn l 1010 r 1010 block,num a陣列訪問原始資料,belong陣列表示每個數屬於哪一塊方便呼叫,l和r表示...

分塊模板題

題目描述 給出乙個長為n的數列,以及n個操作,操作涉及區間加法,單點查值。輸入格式 第一行輸入乙個數字 n 第二行輸入 n 個數字,第 i 個數字為a i 以空格隔開 接下來輸入 n 行詢問,每行輸入四個數字 opt,l,r,c,以空格隔開 若 opt 0,表示將 l,r 的之間的數都加 c 若 o...