bzoj 1086 SCOI2005 王室聯邦

2022-05-11 02:45:09 字數 1150 閱讀 7209

「餘」人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1..n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理,每個省最多只有3b個城市。每個省必須有乙個省會,這個省會可以位於省內,也可以在該省外。但是該省的任意乙個城市到達省會所經過的道路上的城市(除了最後乙個城市,即該省省會)都必須屬於該省。乙個城市可以作為多個省的省會。聰明的你快幫幫這個國王吧!

這題是另一種分塊方法,從下往上做,回溯時入棧,當子樹內的棧元素達到了b,我們就新建乙個塊,子數內的棧中元素加入塊中,因為每乙個子樹塊\(,所以彈棧時 \(<2*b\),對於最後乙個多出來的塊也一定 \(,如果 \(>=b\) 直接新建乙個塊,否則和上個塊合併,由於塊內元素 \(<2*b\),所以加入後 \(<3*b\)

#include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

const int n=1005;

int n,b,head[n],num=0,nxt[n<<1],to[n<<1],cnt=0,st[n],top=0,fa[n],bel[n];

void link(int x,int y)

void dfs(int x,int last)

}st[++top]=x;

}void work()

dfs(1,1);

while(top)bel[st[top--]]=cnt;

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

for(int i=1;i<=n;i++)printf("%d ",bel[i]);

puts("");

for(int i=1;i<=cnt;i++)printf("%d ",fa[i]);

}int main()

bzoj1086 scoi2005 王室聯邦

題目鏈結 本來是來學樹上分塊的,沒想到正解是貪心 dfs。題意 求將樹分為幾個聯通塊,每個聯通塊大小大於b小於3b,是否可行。solution1 題都沒看就翻了題解。發現時貪心 dfs。一遍dfs即可。注意到以x為根節點時,其兒子s,則子樹s中與s相連的節點的連通塊,如果要構成乙個省,既可以s作為省...

bzoj1086 SCOI2005 王室聯邦

description 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的城市之間有且僅有一條直接或間接的道路。為了防止管理太過分散,每個省至少要有b個城市,為了能有效的管理...

BZOJ 1086 SCOI2005 王室聯邦

啊啊啊啊啊啊啊啊啊啊啊啊 又是一道赤果果的水水模板題 沒辦法啊我太弱了。好吧 這是一道樹分塊 原題戳對其實你們依然不用戳 餘 人國的國王想重新編制他的國家。他想把他的國家劃分成若干個省,每個省都由他們王室聯邦的乙個成 員來管理。他的國家有n個城市,編號為1.n。一些城市之間有道路相連,任意兩個不同的...