zoukankan      html  css  js  c++  java
  • NOIP模拟测试8「匹配·回家」

    匹配

    哈希能A

    水到爆炸

    回家

    事实上我做过一个原题,甚至比这个回家难的多,而且那个题多组询问必经点

    然后我做一组询问就打炸了

    大约就是删了很多东西,然后自己想的太简单了

    直接统计了割点,懒得打lca和树上差分,懒得打dfs,偷懒让我付出很大代价

    最后只有10,

    打代码一定不能偷懒,一定不能偷懒

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define A 810000
    ll dfn[A],low[A],ver[A],nxt[A],head[A],s[A],fa[A],belong[A],kx[A];
    ll Head[A],Nxt[A],Ver[A],To[A],vst[A];
    ll tot=0,tot2=0,num=0,n,m,t,root;
    vector<ll> dcc[A],ans;
    bool cut[A];
    void add(ll x,ll y){
        nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;
    }
    void Add(ll x,ll y){
        Nxt[++tot2]=Head[x],Head[x]=tot2,Ver[tot2]=y;
    }
    inline ll read(){
        ll f=1,x=0;char c=getchar();
        while(!isdigit(c)){
            if(c=='-') f=-1;
            c=getchar();
        }
        while(isdigit(c)){
            x=(x<<1)+(x<<3)+(c-'0');
            c=getchar();
        }
        return f*x;
    }
    void tarjan(ll x)
    {
        ll flag=0;
        dfn[x]=low[x]=++tot;
        s[++s[0]]=x;
        for(ll i=head[x];i;i=nxt[i])
        {
            ll y=ver[i];
            if(!dfn[y])
            {
                tarjan(y);
                low[x]=min(low[x],low[y]);
                if(low[y]>=dfn[x])
                {
                    flag++;
                    num++;
                    if(flag>1||x!=root)cut[x]=1;
                    while(s[0])
                    {
                        ll p=s[s[0]--];
                        dcc[num].push_back(p);
                        if(p==y)break;
                    }
                    dcc[num].push_back(x);
                }
            }
            else low[x]=min(low[x],dfn[y]);
        }
    }
    void dfs(ll x)
    {
        if(x==belong[n])return ;
        vst[x]=1;
        for(ll i=Head[x];i;i=Nxt[i])
        {
            ll y=Ver[i];
            if(vst[y])continue;
            fa[y]=x;
            dfs(y);
        }
        return ;
    }
    void re(){
        num=0,tot=0;ans.clear();tot2=0;
        for(ll i=0;i<=800000;i++)    
            dcc[i].clear();
        memset(nxt,0,sizeof(nxt));
        memset(Head,0,sizeof(Head));
        memset(Nxt,0,sizeof(Nxt));
        memset(fa,0,sizeof(fa));
        memset(vst,0,sizeof(vst));
        memset(head,0,sizeof(head));
        memset(ver,0,sizeof(ver));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(cut,0,sizeof(cut));
        memset(kx,0,sizeof(kx));
    }
    int main()
    {
        t=read();
        while(t--){
            re();
            n=read(),m=read();
            for(ll i=1;i<=m;i++){
                ll x=read(),y=read();
                add(x,y);
                add(y,x);
            }
            for(ll i=1;i<=n;i++)
                if(!dfn[i]) root=i,tarjan(i);
            ll nu=num;
            for(ll i=1;i<=n;i++)
                if(cut[i])belong[i]=++nu,kx[nu]=i;
            for(ll i=1;i<=num;i++)
                for(ll j=0;j<dcc[i].size();j++){
                    ll x=dcc[i][j];
                    if(cut[x]) Add(belong[x],i),Add(i,belong[x]);
                    else belong[x]=i;
                }
    /*        for(ll i=1;i<=n;i++){
                cout<<"belong="<<belong[i]<<endl;
            }
    */        dfs(belong[1]);
            ll x=fa[belong[n]];
            while(x!=belong[1]){
                if(x==0) break;
                if(x>num) ans.push_back(kx[x]);
                x=fa[x];
            }
            printf("%lld
    ",1ll*ans.size());
            sort(ans.begin(),ans.end());
            for(ll i=0;i<ans.size();i++)
                printf("%lld ",ans[i]);
            cout<<endl;
        }
    }
    我已没有下降的余地
  • 相关阅读:
    JS内置对象-Array之splice-删插替
    for-in的缺点
    Obeject.hasOwnProperty
    JS中的深拷贝和浅拷贝
    函数中this的指向
    CSS预处理器之less和sass
    [转]javaweb学习总结(四十四)——监听器(Listener)学习
    [转]javaweb学习总结(四十三)——Filter高级开发
    [转]javaweb学习总结(四十二)——Filter(过滤器)学习
    [转]javaweb学习总结(四十一)——Apache的DBUtils框架学习
  • 原文地址:https://www.cnblogs.com/znsbc-13/p/11248153.html
Copyright © 2011-2022 走看看