首页 > 其他分享 >牛客多校赛第9场G Game

牛客多校赛第9场G Game

时间:2023-08-17 10:00:08浏览次数:35  
标签:include int 异或 黑板 牛客 Game bigoplus 校赛 获胜

黑板上有一些数字,Alice和Bob轮流操作,每次操作可以选择黑板上的两个数(两个数可以相同),然后在黑板上写下这两个数的异或。谁先写出k谁赢。

首先重复的数字是没有用的,进而可以推出除整局游戏的第一步之外,都可以选择保持当前的局面不变.

比如如果一个玩家面对的是一个必输的局面,他就可以选择保持局面不变再将这个局面送给对面。

因为这个性质的存在,所以游戏的发展有如下三种情况。

1、 先手一步获胜。

这就要求存在\(a_i \bigoplus a_j = k\)

2、先手无法一步获胜,并且无论先手选择哪两个,后手都可以获胜。

也就是对于任意的\(i , j\)都存在\(p\),满足\(a_i \bigoplus a_j = a_p \bigoplus k\)

将这个式子的左边两项都异或上k

\[(a_i \bigoplus k)\bigoplus (a_j \bigoplus k) = a_p \bigoplus k \]

然后用\(a^`\)来代替\(a\)则有

\[a^`_i \bigoplus a^`_j = a^`_p \]

也就是\(a^`\)对于异或操作是封闭的。

也就是等价于,\(a^`\)中不同的数字的个数==2^(线性基的维数)

3、先手不能一步获胜,后手也不满足条件,所以两者就会一直僵持下去,最终平局。

#include<algorithm>
#include<iostream>
using namespace std;
const int N = 1e6+10;
int n , m , k;
int A[N] , B[N] , p[30];
void Solve()
{
	int tmp , pos , num;
	cin >> n >> k;
	for(int i = 1 ; i <= n ; ++i) cin >> A[i] , B[i] = A[i];
	sort(B + 1 , B + 1 + n);
	m = unique(B + 1 , B + 1 + n) - B - 1;
	for(int i = 1 ; i <= n ; ++i)
	{
		tmp = A[i] ^ k;
		pos = lower_bound(B + 1 , B + 1 + m , tmp) - B;
		if(pos <= m && B[pos] == tmp) { cout << "Alice" << '\n'; return ; }
	}
	for(int i = 0 ; i < 30 ; ++i) p[i] = 0;
	for(int i = 1 ; i <= n ; ++i)
	{
		tmp = A[i] ^ k;
		for(int j = 29 ; j >= 0 ; --j)
		{
			if(tmp & (1 << j))
			{
				if(!p[j]) { p[j] = tmp; break; }
				else tmp ^= p[j];
			}
		}
	}
	num = 0;
	for(int i = 0 ; i < 30 ; ++i) if(p[i]) num++;
	if((1 << num) == m)
		cout << "Bob" << '\n';
	else
		cout << "Draw" << '\n';
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T;
	cin >> T;
	while(T--) Solve();
	return 0;
}

标签:include,int,异或,黑板,牛客,Game,bigoplus,校赛,获胜
From: https://www.cnblogs.com/sybs5968QAQ/p/17636834.html

相关文章

  • 杭电多校赛第9场1002 Shortest path
    给定一个数字n,每次可以选择一项。令n=n-1令n=n/2,ifn%2==0令n=n/3,ifn%3==0求最少需要多少步可以让其变成1.减1操作可以看作是为了除法做准备,连续超过两次减1再除2是不优的,连续超过三次减1再除2也是不优的。可以根据下一步除2还是除3来分出两个分......
  • 牛客多校赛第9场D Error Permutaition
    给定一个长度为n的排列,计算满足条件的子区间的个数。对于子区间\([l,r]\)要求任意区间第k小,不在区间的第k个位置上。\(n<=5000\)从每个值入手,设这个值为先,寻找对于x来讲是不合法的区间,也就是x在这个区间中是第k小,并且在区间的第k个位置上。1.如果固定区间左端点l,那么右端......
  • games101-lecture-notes
    Games101课程笔记Created:2023-06-07T20:54+08:00Published:2023-08-16T21:05+08:00Categories:ComputerGraphics目录Lecture01:OverviewofComputerGraphicsmotivation:学了有什么用?课程内容课程资源Lecture02:ReviewofLinearAlgebra点乘叉乘叉乘的作用Lecture03......
  • 2023牛客暑期多校训练营8
    A.AliveFossils纯模拟没啥好说的map<string,int>mp;voidsolve(){intn;cin>>n;for(inti=1;i<=n;i++){intt;cin>>t;while(t--){strings;cin>>s;mp[s]++;}}......
  • AGC064C Erase and Divide Game
    题面传送门首先考虑你只插入若干个数怎么做:按位从低到高插入一棵Trie,问题就变成:在Trie上每次可以往左儿子走或者往右儿子走,如果当某个人操作的时候为空节点那么这个人就输了。如果我们可以将这棵树建出来那么这个问题就是好解决的,可惜建不出来。仿照从高到低建Trie的方法,将......
  • 『题解』ABC261Ex Game on Graph
    题目链接震惊!这个题竟然被神犇szs放进了博弈论里!我真的没看出来除了题面还有哪里像博弈论(也许是因为我菜)。转移方式很显然,按照题面说的做就行了。那么正解也就呼之欲出了。但是我知道大家都会正解,就是魔改的堆优化Dijkstra,所以我想说的是一种歪解,以及它是歪解的原因。歪解......
  • 2023牛客暑期多校训练营7
    C.BeautifulSequence题意:有长为\(n\)的数组\(a\),通过操作\(a_i\oplusa_{i+1}\)得到\(b_i\),现在给出数组\(b\),求出字典序第\(k\)小的数组\(a\)Solution不难发现,如果确定了\(a_1\)的某一二进制位上的数,就可以确定整个数组\(a\)的这一位上的数,我们首先把所有的二进制位数都变......
  • 2023牛客暑期多校训练营9--I Non-Puzzle: Segment Pair
    思路:直接枚举区间左端点,用一个cnt数组表示当前端点l,r或者L,R存在1个还是2个或者0个。用一个sum变量记录有多少段区间覆盖了该端点,如果sum==n那么这个端点就有了贡献。更详细的看代码注释。#include<bits/stdc++.h>usingnamespacestd;#defineIOSios::sync_with_stdio(fa......
  • 2023牛客多校(9)
    D首先考虑枚举一个左端点然后我们就会发现,对于一个位置来说,会影响它的只有前缀和后缀比它小的数于是让每个数字不合法的都是一个区间可以预处理$[L,i]$这个范围内有几个比它小的数,设为$x$然后就能知道第一个让它不合法的位置($i-L-x$)个比它小的数的位置而让它重新合法......
  • 2023牛客多校第九场 D Non-Puzzle: Error Permutation
    题意给定一个长度为n的序列,计算有多少个子区间满足子区间第K小的数不在子区间第K位。 找出所有不满足条件的区间。枚举所有的ai和左端点al,找出满足ai是区间[l,r]中第r-l+1小的右端点r,则右端点r一定是一段区间。例如   342165         l i ......