牛客多校10 War of Inazuma (Easy Version) (n维超立方,亦或取反,关系迭代继承,二进制)

49 篇文章 1 订阅
21 篇文章 0 订阅

War of Inazuma (Easy Version)

题意:
  • 题目描述的十分诡异,什么 n n n 维超立方体,就没看懂

    换一种我能理解的说法就是:一个 n n n 位的二进制数能表示 0 − − 2 n − 1 0--2^n-1 02n1 ,对于这 2 n 2^n 2n 个数来说,每个单独拎出来与之相邻的有 n n n 个(相邻的定义:Two vertices are adjacent if and only if there exists exactly one different bit in their nnn-bit binary representation.)

    现在让你对 2 n 2^n 2n 个顶点进行染色 0   o r   1 0\ or\ 1 0 or 1 ,使得对于每一个顶点,与之相邻的 n n n 个顶点并且颜色相同的顶点个数不超过 n \sqrt{n} n

分析:
  • 现考虑 n = 1 , 2 , 3 n=1,2,3 n=123 ,并且令 0 0 0 顶点( v 0 v_{0} v0 )为 0 0 0 ,顶点个数为 l e n len len

    • n = 1 , 2 n=1,2 n=12 个点, v 0 v_{0} v0 v 1 v_{1} v1 相邻且异色,所以是 01 01 01

    • n = 2 , 4 n=2,4 n=24 个点, v 2 v_{2} v2 v 3 v_{3} v3 相邻且异色, v 2 v_{2} v2 v 0 v_{0} v0 相邻且异色, v 3 v_{3} v3 v 1 v_{1} v1 相邻且异色,所以是 0110 0110 0110

    • n = 3 , 8 n=3,8 n=38 个点, v 6 v_{6} v6 v 7 v_{7} v7 相邻且异色, v 6 v_{6} v6 v 4 v_{4} v4 相邻且异色, v 7 v_{7} v7 v 5 v_{5} v5 相邻且异色 , v 4 v_{4} v4 v 5 v_{5} v5 相邻且异色

      (这是仅仅 后 4 个 后4个 4 之间的关系,完全继承了 前 4 前4 4 个的关系)再加上 后 4 个 后4个 4 前 4 个 前4个 4 之间的关系,

      v 4 v_{4} v4 v 0 v_{0} v0 相邻且异色, v 5 v_{5} v5 v 1 v_{1} v1 相邻且异色, v 7 v_{7} v7 v 3 v_{3} v3 相邻且异色, v 6 v_{6} v6 v 7 v_{7} v7 相邻且异色

      得出结果为: 01101001 01101001 01101001

    我也讲不太明白了 …

    就是当 n = n + 1 n=n+1 n=n+1

    原来的 v 0 v_0 v0 v l e n − 1 v_{len-1} vlen1 保持不变,取反得到 v 0 + l e n v_{0+len} v0+len v 2 l e n − 1 v_{2len-1} v2len1

    大概讲一下为什么这样之后,相邻的 n + 1 n+1 n+1 个点会不相同

    对于 v 0 到 v l e n − 1 v_{0}到v_{len-1} v0vlen1 肯定是成立的,因为 v 0 + l e n v_{0+len} v0+len v 2 l e n − 1 v_{2len-1} v2len1 是由 v 0 v_0 v0 v l e n − 1 v_{len-1} vlen1 取反得来的

    同理,对于 v 0 + l e n v_{0+len} v0+len v 2 l e n − 1 v_{2len-1} v2len1 ,完全继承了 v 0 到 v l e n − 1 v_{0}到v_{len-1} v0vlen1 之间的关系,所以也是成立的

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=(1<<23);
int a[N];
signed main()
{
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int n;
    cin>>n;
    cout<<a[0];
    for(int i=0;i<n;i++)
    {
        int len = 1<<i;
        for(int j=0;j<len;j++)
        {
            a[j+len] = a[j]^1;
            cout<<a[j+len];
        }
    }    
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yezzz.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值