ABC206F Interval Game 2

洛谷 ABC206F Interval Game 2

题目大意

n n n个作左闭右开的区间 [ l i , r i ) [l_i,r_i) [li,ri),Alice和Bob用这些区间玩一个游戏。Alice和bob轮流做如下操作,Alice先手:

  • 从这 n n n个区间中选择一个区间,这个区间和之前选中的区间不能有重叠部分

如果轮到一个玩家时这个玩家不能再操作了,则这个玩家输。如果Alice和Bob都采用最优策略,问最终谁会赢?

t t t组数据。

数据范围

1 ≤ t ≤ 20 , 1 ≤ n ≤ 100 , 1 ≤ l i < r i ≤ 100 1\leq t\leq 20,1\leq n\leq 100,1\leq l_i<r_i\leq 100 1t20,1n100,1li<ri100


题解

根据数据范围可得, l i l_i li r i r_i ri的范围很小,所以我们可以令 s g ( l , r ) sg(l,r) sg(l,r)表示在 [ l , r ) [l,r) [l,r)之间的区间中进行游戏的 s g sg sg值。

在求 s g ( l , r ) sg(l,r) sg(l,r)时,枚举当前选的区间,设选择区间 [ l i , r i ) [l_i,r_i) [li,ri),则选择后的状态为 s g ( l , l i )   x o r   s g ( r i , r ) sg(l,l_i) \ xor \ sg(r_i,r) sg(l,li) xor sg(ri,r)。对每个区间 [ l i , r i ) [l_i,r_i) [li,ri),求选择后的状态,最后求 m e x mex mex,即可求出 s g ( l , r ) sg(l,r) sg(l,r)

因为每次只会有最多 100 100 100个状态被标记,所以 g t ( l , r ) gt(l,r) gt(l,r)最多为 100 100 100,所以其异或和不超过 127 127 127,所以求 m e x mex mex时的桶开 127 127 127以上即可。

为了避免重复求同一个 s g ( l , r ) sg(l,r) sg(l,r),可以用记忆化搜索存储sg值。最后的答案为 s g ( 1 , 100 ) sg(1,100) sg(1,100)

时间复杂度为 O ( t × n 3 ) O(t\times n^3) O(t×n3)

code

#include<bits/stdc++.h>
using namespace std;
int t,n,p[105][105];
struct node{
	int x,y;
}w[105];
int gt(int l,int r){
	if(p[l][r]!=-1) return p[l][r];
	int z[205];
	memset(z,0,sizeof(z));
	for(int i=1;i<=n;i++){
		if(w[i].x>=l&&w[i].y<=r){
			z[gt(l,w[i].x)^gt(w[i].y,r)]=1;
		}
	}
	int x=0;
	for(;z[x];x++);
	p[l][r]=x;
	return p[l][r];
}
int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		memset(p,-1,sizeof(p));
		for(int i=1;i<=n;i++){
			scanf("%d%d",&w[i].x,&w[i].y);
		}
		if(gt(1,100)) printf("Alice\n");
		else printf("Bob\n");
	}
	return 0;
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值