Codechef BALNET Balancing Network Revisited

Link
先考虑\(2|n\)的情况。
考虑构造一个大小为\(\frac n2\)的匹配,然后使得每个匹配中有至少一条线是不统一的。
最开始先任意构造一组匹配。
然后对于一条\((u,v)\)间的边,设\(x,y\)分别为\(u,v\)的匹配点,那么我们让\(u\leftrightarrow v,x\leftrightarrow 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();}

原文链接: https://www.cnblogs.com/cjoierShiina-Mashiro/p/12815263.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Codechef BALNET Balancing Network Revisited

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/345652

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午3:22
下一篇 2023年3月2日 上午3:23

相关推荐