zoukankan      html  css  js  c++  java
  • Codechef BALNET Balancing Network Revisited

    Link
    先考虑(2|n)的情况。
    考虑构造一个大小为(frac n2)的匹配,然后使得每个匹配中有至少一条线是不统一的。
    最开始先任意构造一组匹配。
    然后对于一条((u,v))间的边,设(x,y)分别为(u,v)的匹配点,那么我们让(uleftrightarrow v,xleftrightarrow y)
    构造完匹配之后,我们钦定其中任意一个点为不统一的。
    然后我们再倒序遍历每条边推回初始状态即可。

    #include<tuple>
    #include<cctype>
    #include<cstdio>
    #include<cstring>
    const int N=1000007;
    char ibuf[1<<24|1],*iS=ibuf,ans[N];int mat[N],vis[N];
    std::tuple<int,int,int,int>a[N];
    int read(){int x=0;while(isspace(*iS))++iS;while(isdigit(*iS))(x*=10)+=*iS++&15;return x;}
    void combine(int u,int v){mat[u]=v,mat[v]=u;}
    void solve()
    {
        int n=read(),m=read();mat[n]=0,ans[m+1]=0,memset(vis+1,0,4*n);
        for(int i=1;i<n;i+=2) combine(i,i+1);
        for(int i=1,u,v,x,y;i<=m;++i) x=mat[u=read()],y=mat[v=read()],a[i]={u,v,x,y},combine(u,v),combine(x,y);
        for(int i=1;i<=n;++i) if(i>mat[i]) vis[i]=1;
        for(int u,v,x,y;m;--m)
        {
    	std::tie(u,v,x,y)=a[m],combine(u,x),combine(v,y);
    	if(vis[u]&&vis[x]) std::swap(vis[u],vis[v]),ans[m]='^';
    	else if(vis[v]&&vis[y]) std::swap(vis[u],vis[v]),ans[m]='v';
    	else ans[m]=vis[v]? 'v':'^';
        }
        puts(ans+1);
    }
    int main(){fread(ibuf,1,1<<24,stdin);for(int T=read();T;--T) solve();}
    
  • 相关阅读:
    Linux小命了(6)cd
    Linux小命令(5)mkdir
    性能测试(1)-开篇杂谈
    Linux小命令(4)ls
    Linux小命令(3)cat
    Linux小命令(2)man
    机器学习-学习方法
    flask-cache
    mysql 常用时间函数
    发现变化,拥抱变化
  • 原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12815263.html
Copyright © 2011-2022 走看看