• BZOJ 1015 [JSOI2008]星球大战starwar


    今天效率终极无敌低。

    一开始没读懂题。给你一张图,每次删除一个点和该点连出的边,问每次删除后未被删除的点构成的图的连通块的个数。

    考虑倒着做,先把所有点删完,每次往图中加点,并查集维护连通块,每加进一个点ans++,然后找它的边,若是连出的点和它不在同一个并查集中,合并,ans--;

    第一次找连通块的时候我暴力合并然后把所有并查集的代表元拿出来去了个重,一开始忘排序了wa成zz。。。。

    //Twenty
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<vector>
    typedef long long LL;
    const int maxn=200000*2;
    using namespace std;
    int n,m,sz,fa[maxn],fir[maxn],nxt[maxn],to[maxn],q[maxn],k,ecnt,no[maxn],que[maxn],ans[maxn];
    void add(int u,int v) {
        nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
        nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
    }
    int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
    void init() {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++) {
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
        }
        scanf("%d",&k);
        for(int i=1;i<=k;i++) {
            scanf("%d",&q[i]);
            no[q[i]]=1;
        }
    }
    void work() {
        int now=0;
        for(int i=0;i<n;i++) fa[i]=i;
        for(int i=0;i<n;i++) if(!no[i]){
            for(int j=fir[i];j;j=nxt[j]) if(!no[to[j]]) {
                int u=find(i),v=find(to[j]);
                if(u!=v) {
                    fa[v]=u;
                }
            }
        }
        for(int i=0;i<n;i++) if(!no[i]){
             int u=find(i);
             que[++sz]=u;
        }
        sort(que+1,que+sz+1); 
        int tpsz=0;
        for(int i=1;i<=sz;i++) {
             if(i==1||que[i]!=que[i-1]) tpsz++;
        }
        sz=tpsz; now=sz;
        ans[k]=sz;
        for(int i=k;i>=1;i--) {
            no[q[i]]=0; now++;
            for(int j=fir[q[i]];j;j=nxt[j]) if(!no[to[j]]){
               int u=find(q[i]),v=find(to[j]);
               if(u!=v) {
                   now--;
                   fa[u]=v;
               } 
            }
            ans[i-1]=now;
        }
        for(int i=0;i<=k;i++) printf("%d
    ",ans[i]);    
    }
    int main()
    {
        init();
        work();
        return 0;
    }
    View Code
  • 相关阅读:
    博客地址
    Version 1.4.2_03 of the JVM not suitable for this product.解决
    http请求(一) 工具
    Service 的两种启动方法和区别
    软件开发过程应该采用集中优势兵力各个击破
    架构感悟
    嵌套事务模版
    软件行业对人才的依赖
    使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较
    架构设计中的分层与分区
  • 原文地址:https://www.cnblogs.com/Achenchen/p/7581901.html
Copyright © 2020-2023  润新知