Ja50nY0un9_as_AgNO3 @ 2022-11-15 09:31:50
rt,全WA
具体看注释吧
# include <iostream>
# include <vector>
# define int long long
using namespace std;
int ft[400001];
vector <int> v[400001];
int des[400001];
int ans[400001];
bool flag[400001];
int find(int x)
{
if(ft[x]==x) return x;
return ft[x]=find(ft[x]);
}
void merge(int x, int y)
{
ft[find(x)]=find(y);
}
signed main()
{
int n, m, k;
cin>>n>>m;
while(m--)
{
int x, y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
//建图
}
cin>>k;
for(int i=0; i<n; i++) ft[i]=i;
for(int i=k; i>=1; i--)
{
cin>>des[i];
flag[des[i]]=true;
//反向存储,以备修建
}
ans[0]=n-k;
//未被摧毁的星球数目
//初始都是单独的联通块
for(int i=0; i<n; i++)
{
if(flag[i]) continue;
for(int j=0; j<v[i].size(); j++)
{
int y=v[i][j];
if(flag[y]) continue;
if(find(i)==find(y)) continue;
merge(i, y);
ans[0]--;
//建最终状态
}
}
for(int i=1; i<=k; i++)
{
int x=des[i];
flag[x]=false;
ans[i]++;//初始单个星球就是一个联通块
ans[i]+=ans[i-1];//建立在上一个基础上
for(int j=0; j<v[x].size(); j++)
{
int y=v[x][j];
if(flag[y]) continue;
//若另一头仍未修复
if(find(x)==find(y)) continue;
//不在同一个联通块
merge(x, y);
ans[i]--;
//两个联通块合并为一个
}
}
cout<<ans[0]<<endl;
for(int i=k; i>=1; i--)
{
cout<<ans[i]<<endl;
//按摧毁顺序输出
}
return 0;
}
by Ja50nY0un9_as_AgNO3 @ 2022-11-15 09:32:29
都在第一行就WA了,有过大有过小
by Whisperain @ 2022-11-15 10:36:38
,,,有点无法吐槽
by Whisperain @ 2022-11-15 10:38:37
cout<<ans[0]<<endl;
for(int i=k; i>=1; i--)
{
cout<<ans[i]<<endl;
//按摧毁顺序输出
}
改为
for(int i=k; i>=1; i--)
{
cout<<ans[i]<<endl;
//按摧毁顺序输出
}
cout<<ans[0]<<endl;
by Whisperain @ 2022-11-15 14:09:04
@Ja50nY0un9
by Ja50nY0un9_as_AgNO3 @ 2022-11-15 14:10:56
额……?
我去试试
@Whisperain 谢谢
by Ja50nY0un9_as_AgNO3 @ 2022-11-15 14:12:06
@Whisperain 已过,谢谢
您获得了粉丝*1