#include #include #include #include #include using namespace std; const int MAXK = 2005; const int MAXN = 2e6 + 1005 + 5; ifstream fin("monyo.in"); ofstream fout("monyo.out"); int n; bool isLoyal[MAXN]; vector graph[MAXN]; int zoneSz[MAXN]; void DFS1(int x, int last) { if(last!=-1 && graph[x].size()==1) { zoneSz[x] = ((isLoyal[x]==0)?1:0); return; } zoneSz[x] = ((isLoyal[x]==0 && last!=-1)?1:0); for(int y: graph[x]) { if(y==last) continue; DFS1(y, x); if(isLoyal[y]==0) zoneSz[x] += zoneSz[y]; } } int skip[MAXN]; vector > units; vector houses; int memo[MAXK][MAXK]; vector toRemove[MAXN]; int DFS2(int x, int last, int sum, int cntBad) { if(isLoyal[x]==1 || last==-1) { cntBad += ((isLoyal[x]==1)?1:0); sum += zoneSz[x]; } int ind = -1, skipInd = -1; if(isLoyal[x]==1 || last==-1) { ind = units.size(); skipInd = ind + 1; houses.push_back(x); units.push_back({cntBad, sum}); } for(int y: graph[x]) { if(y==last) continue; skipInd = max(skipInd, DFS2(y, x, sum, cntBad)); } skip[ind] = skipInd; return skipInd; } void init() { DFS1(1, -1); DFS2(1, -1, 0, 0); memset(memo, -1, sizeof(memo)); } int calcState(int ind, int wasted) { if(ind>=units.size()) return 0; if(memo[ind][wasted]!=-1) return memo[ind][wasted]; int ans = 0; //don't take ans = max(ans, calcState(skip[ind], wasted)); //take //skip if(wasted>=((ind==0)?0:1)) ans = max(ans, calcState(skip[ind], wasted-((ind==0)?0:1)) + zoneSz[houses[ind]]); //go to children if(wasted>=((ind==0)?0:1)) ans = max(ans, calcState(ind+1, wasted-((ind==0)?0:1)) + zoneSz[houses[ind]]); memo[ind][wasted] = ans; return ans; } int main() { ios::sync_with_stdio(false); fin.tie(NULL); fin >> n; for(int i = 0;i> u >> v; graph[u].push_back(v); graph[v].push_back(u); } string help; fin >> help; for(int i = 0;i s; int last = 0; s.insert(0); toRemove[0+calcState(0, 0)+1].push_back(0); for(int cnt = 1;cnt