专栏文章

题解:AT_arc207_b [ARC207B] Balanced Neighbors 2

AT_arc207_b题解参与者 6已保存评论 5

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
5 条
当前快照
1 份
快照标识符
@minnat3d
此快照首次捕获于
2025/12/02 05:12
3 个月前
此快照最后确认于
2025/12/02 05:12
3 个月前
查看原文
你好吗?这题需要你用忍者的态度来观察呦。
首先你需要用手写的从前,来跨时代的发现 <6< 6 的情况不可能存在。
接着你看甜甜的样例,当 n12n\le 1211 只不能到 121222 只不能到 111133 只不能到 1010,ok 以此类推。
然后我们猜测对于 nn 是偶数的时候肯定有答案,答案应该是对于每个 ii,都有 in+1ii\to n+1-i(但是它给我们玩了个黑色幽默,这只是特殊解)。
怎么了,这个样例明明就只有一点点,然后你从样例里啥也看不出了。。。(傻笑)
通过刚刚的猜测,我们可以注意到偶数当我们构造一个循环,对于 ini+1i\to n-i+1 之间的有着开不了口的距离 33,其他点之间的距离为 1122
因此,nn 为偶数的构造方法即为:
对于点 i[1,n2],j[n2+1,n]i\in[1,\frac{n}{2}],j\in[\frac{n}{2}+1,n],将点 iijj 连边,当 i+jn+1i+j\ne n+1 我们将点 iji\to j
如果你现在就交的话,你会发现说好的幸福呢?对不起,它给了让你安静的 Wa,你还是挂了恰好一半的点。
胡扯,我们追求完美主义,给我一首歌的时间,你就会想起其实还是有奇数解的,构造出 n=n1n'=n-1 的偶数情况下的图,并将 nn1n21\sim \frac{n}{2} 连边。
CPP
cin>>n;
if(n<6) cout<<"-1",exit(0);
int t=n>>1;
cout<<t*(t-1)+(n&1)*t<<'\n';
rep(i,1,t){
    rep(j,t+1,t+t){
        if(i+j!=t+t+1) cout<<i<<' '<<j<<'\n';
    }
    if(n&1) cout<<i<<' '<<n<<'\n';
}

评论

5 条评论,欢迎与作者交流。

正在加载评论...