社区讨论

蒟蒻求助今晚的Atcoder E

学术版参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo84ifc6
此快照首次捕获于
2023/10/27 12:38
2 年前
此快照最后确认于
2023/10/27 12:38
2 年前
查看原帖
大致想法是二分,对每个能删不超过 k 的点就删,但是不懂为什么 WATLE 了,明明感觉和一些 AC 代码差不多。
CPP
#include<bits/stdc++.h>
#define INF 1e15
#define N 200010
#define ll long long
using namespace std;
ll n,m,cnt,head[N];
ll ans,sum,a[N],s[N],ss[N];
bool st[N];
struct edge
{
	int u,v,next;
}g[N<<1];
queue<int> Q;

bool check(ll k)
{
	while(!Q.empty()) Q.pop();
	int x,y;
	for(int i=1 ; i <= n ; ++i)
	{
		st[i]=0,ss[i]=s[i];	
		if(ss[i] <= k) Q.push(i),st[i]=1;
	}
	while(!Q.empty())
	{
		x=Q.front();
		Q.pop();
		st[x]=1;
		for(int i=head[x] ; i ; i=g[i].next)
		{
			y=g[i].v;
			ss[y]-=a[x];
			if(ss[y] <= k && !st[y]) Q.push(y);
		}
	}
	for(int i=1 ; i <= n ; ++i) 
	{
		if(ss[i] <= 0) st[i]=1;
		if(!st[i]) return false;
	}
	return true;
}

inline ll read()
{
	ll X=0,s=1;char ch;ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')s=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){X=X*10+ch-'0',ch=getchar();}
	return X*s;
}

int main()
{
	ll u,v;
	n=read(),m=read();
	for(int i=1 ; i <= n ; ++i) a[i]=read();
	for(int i=1 ; i <= m ; ++i)
	{
		u=read(),v=read();
		g[++cnt]=(edge){u,v,head[u]};
		head[u]=cnt;
		g[++cnt]=(edge){v,u,head[v]};
		head[v]=cnt;
		s[u]+=a[v];
		s[v]+=a[u];
		sum=max(sum,s[u]);
		sum=max(sum,s[v]);
	}
	ll l=0,r=sum+1,mid;
	while(l < r)
	{
		mid=(l+r)>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	if(check(0)) cout<<0;
	else printf("%lld",r);
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...