求调
查看原帖
求调
390742
qwqUwU楼主2022/9/9 13:23

后半段按照这道题抄的,也不知道哪里错了。

目前过了 1414 个点,可能是理解有问题吧。

#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;
}
2022/9/9 13:23
加载中...