求助,两个点TLE了

P1197 [JSOI2008] 星球大战

Autonomier @ 2019-12-29 20:20:11


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 500050
inline int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
int n,m;
int fa[maxn];
int head[maxn];
int dam[maxn];//记录哪个星球被破坏 
bool da[maxn];//是否已经破坏 
int res[maxn];//记录答案 
struct Eage
{
    int nt;
    int fr;
    int to;
}e[maxn*2];
int cnt;
inline void update(int u,int v)
{
    e[++cnt].nt=head[u];
    e[cnt].fr=u;
    e[cnt].to=v;
    head[u]=cnt;
}
inline int find(int x)
{
    while(fa[x]!=x)
    {
        x=fa[x];
    //  cout<<1; 
    }
    return x;
}
int main()
{
    n=read();
    m=read();
    for(int i=1;i<=m;i++)
    {
        int u,v;
        u=read();
        v=read();
        update(u,v);
        update(v,u); 
    }
    for(int i=0;i<=n;i++)
    {
        fa[i]=i;    
    } 
    int k=read();
    //int trans=k;
    int sum=n-k;
    for(int i=1;i<=k;i++)
    {
        dam[i]=read();
        da[dam[i]]=true;
    }
    for(int i=1;i<=m*2;i++)
    {
        if(!da[e[i].fr]&&!da[e[i].to]&&find(e[i].fr)!=find(e[i].to))
        {
            sum--;
            if(e[i].fr!=e[i].to)
                fa[find(e[i].fr)]=find(e[i].to);
        }
    }
    res[k+1]=sum;
    //da[dam[k]]=false;
    for(int l=k;l>=1;l--)
    {
        //cout<<k;
        sum++;
        da[dam[l]]=false;
        for(int i=head[dam[l]];i;i=e[i].nt)
        {
            if(!da[e[i].fr]&&!da[e[i].to]&&find(e[i].fr)!=find(e[i].to))
            {
                sum--;
                if(e[i].fr!=e[i].to)
                    fa[find(e[i].fr)]=find(e[i].to);
            }
        }
        res[l]=sum;
    }
    //cout<<888;
    for(int i=1;i<=k+1;i++)
    {
        printf("%d\n",res[i]);
    }
    return 0;
}

|