zoukankan      html  css  js  c++  java
  • LOJ#551 Matrix

    本地打表在线AC什么的最喜欢了。

    题意

    ( m Alice)( m Bob)在玩游戏,他们要给一个(n imes n)的矩阵打标记。初始时没有任何标记,每一轮( m Bob)先手,两个人可以选一个格子打上自己的标记(( m Alice o A,Bob o B)),但如果选择了已经打过标记的格子就输掉游戏。

    如果在某个时刻,存在一个长度为(n)的排列(p)使得对于(i=1,2,dots,n),有第(i)行第(p_i)列的标记为( m A)成立,那么( m Alice)获胜。

    如果在(lfloorfrac{n^2}{2} floor)轮后,( m Alice)依然没有获胜,那么( m Bob)获胜。

    给定(T)组询问,每次给定一个数(n),问在之前的游戏规则下:

    (1)、双方记得之前的所有操作,( m Alice)是否有必胜策略。

    (2)( m Alice)只记得当前这一轮( m Bob)的操作,( m Bob)记得所有操作,( m Alice)是否有必胜策略。

    (Tleq 100,nleq 10^{18})

    题解

    这种题目就应该大力猜结论。

    先考虑比较简单的第一问,在(n)比较大的平凡情况下,假设( m Bob)标记了第(x)行的某个格子,那么( m Alice)就可以选择第(x)行的另一个格子(记为第(y)列)。之后,( m Alice)选择第(y)列上的格子一定是不优的,因此对( m Alice)来说,她可以将棋盘重新看作((n-1) imes (n-1))大小的。只要在((n-1) imes (n-1))时有必胜策略,那么(n imes n)时就一定有必胜策略。

    那么暴搜最小的有必胜策略的(n),可以本地发现(n=4)时有必胜策略,因此第一问的答案就是([ngeq 4])

    对于第二问,显然必胜策略应该避免选择已经标记过的格子。可以发现唯一的方法就是使棋盘上的格子两两匹配,对于每一个匹配,假如( m Bob)选择了其中一个,那么( m Alice)就立即选择另一个。

    首先(n)为奇数的时候显然无解,考虑怎么在(n)为偶数的时候构造一种匹配方案,使得对于每一个匹配无论选择哪一个,总存在一个排列满足对应的位置都标记了( m A)

    先本地暴搜(n)小的情况(当然要加一点剪枝),可以发现(n=4)(n=6)都是有解的。

    那么对于更大的(n),只要在对角线上依次放上(n=4)(n=6)的,剩下的位置随便匹配即可。

    比如下面就是(n=10)的构造方法,蓝色部分随意匹配即可。

    栗子

    于是第二问的答案就是([ngeq 4,nequiv 0(mod 2)])

    #include<cstdio>
    #define int long long
    signed main()
    {
    	int T,n;
    	scanf("%lld",&T);
    	while(T--)
    	{
    		scanf("%lld",&n);
    		puts(n>=4?"Yes":"No");
    		puts(n>=4&&!(n&1)?"Yes":"No");
    	}
    	return 0;
    }
    
  • 相关阅读:
    Python环境变量设置
    Java基础视频笔记(八):多线程编程
    Java基础视频笔记(六):本地文件操作
    设计延迟加载的“单例设计模式”
    Java数组去除重复元素
    博客园真不错,终于发现一个清净之处
    [Architecture Design] 系统边界设计
    [Chatter] 架构设计是做甚么
    [DCF] Devices Communication Foundation Architecture V4
    [WPF] DataTemplate Binding to Interface
  • 原文地址:https://www.cnblogs.com/Mr-Spade/p/10210583.html
Copyright © 2011-2022 走看看