后半段按照这道题抄的,也不知道哪里错了。
目前过了 14 个点,可能是理解有问题吧。
#include<bits/stdc++.h>
#define ll long long
#define P make_pair
using namespace std;
const int N=1e6+10;
inline int read(){
int x=0,f=1,c=getchar();
while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,T;
priority_queue< pair<int,int> >q1,q2,q3,q4,q5;
queue<int>q;
int a[N],b[N],tot;
vector<int>G[N];
int vis[N],size[N],fa[N],in[N],flag[N],maxn,whole_size,root;
int cost,ans[N];
inline void topusort(){
for(int i=1;i<=n;i++)
if(in[i]==1){
vis[i]=1;
q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(vis[v])continue;
fa[u]=v;
size[v]+=size[u];
in[v]--;
if(in[v]==1){
q.push(v);
vis[v]=1;
}
}
}
}
inline void dfs(int u){
if(!vis[u]&&u!=root){
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!vis[v])continue;
maxn=max(maxn,size[v]);
}
}
flag[u]=1;
whole_size++;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!flag[v])dfs(v);
}
}
int main(){
n=read(),T=read();
for(int i=1;i<=n;i++){
int u=read(),v=read();
G[u].push_back(v);
G[v].push_back(u);
in[u]++,in[v]++;
}
fill(size+1,size+n+1,1);
topusort();
for(int u=1;u<=n;u++){
if(flag[u])continue;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa[u]||!vis[v])continue;
a[++tot]=size[v];
b[tot]=size[v];
}
whole_size=maxn=0;
root=u;
dfs(u);
if(vis[u]){
a[++tot]=whole_size-size[u];
b[tot]=whole_size-size[u];
}
else{
a[++tot]=maxn;
b[tot]=whole_size-size[u];
}
}
n=tot;
for(int i=1;i<=n;i++)q1.push(P(a[i],i)),q3.push(P(b[i],i));
while(T>0){
cost++;
int opt=0,i,j;
maxn=-1;
while(!q1.empty()&&ans[q1.top().second]!=0)q1.pop();
while(!q2.empty()&&ans[q2.top().second]!=1)q2.pop();
while(!q3.empty()&&ans[q3.top().second]!=0)q3.pop();
while(!q4.empty()&&ans[q4.top().second]!=1)q4.pop();
while(!q5.empty()&&ans[q5.top().second]!=2)q5.pop();
if(!q1.empty()){
int x=q1.top().first;
int u=q1.top().second;
if(maxn<x){
maxn=x;
opt=1;
i=u;
}
}
if(!q2.empty()){
int x=q2.top().first;
int u=q2.top().second;
if(maxn<x){
maxn=x;
opt=2;
i=u;
}
}
if(!q3.empty()&&!q4.empty()){
int x=q3.top().first+q4.top().first;
int u=q3.top().second,v=q4.top().second;
if(maxn<x){
maxn=x;
opt=3;
i=u;
j=v;
}
}
if(!q3.empty()&&!q5.empty()){
int x=q3.top().first+q5.top().first;
int u=q3.top().second,v=q5.top().second;
if(maxn<x){
maxn=x;
opt=4;
i=u;
j=v;
}
}
T-=maxn;
if(opt==1){
ans[i]++;
q1.pop();
q2.push(P(b[i]-a[i],i));
q4.push(P(-a[i],i));
}
if(opt==2){
ans[i]++;
q2.pop();
q5.push(P(a[i]-b[i],i));
}
if(opt==3){
ans[i]+=2;
ans[j]--;
q3.pop();
q4.pop();
q5.push(P(a[i]-b[i],i));
q1.push(P(a[j],j));
q3.push(P(b[j],j));
}
if(opt==4){
ans[i]+=2;
ans[j]--;
q3.pop();
q5.pop();
q5.push(P(a[i]-b[i],i));
q2.push(P(b[j]-a[j],j));
q4.push(P(a[j],j));
}
}
printf("%d",cost);
return 0;
}