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...