社区讨论
蒟蒻求助今晚的Atcoder E
学术版参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo84ifc6
- 此快照首次捕获于
- 2023/10/27 12:38 2 年前
- 此快照最后确认于
- 2023/10/27 12:38 2 年前
大致想法是二分,对每个能删不超过 k 的点就删,但是不懂为什么
CPPWA 还 TLE 了,明明感觉和一些 AC 代码差不多。#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 条回复,欢迎继续交流。
正在加载回复...