首页 > 其他分享 >[AGC064C] Erase and Divide Game

[AGC064C] Erase and Divide Game

时间:2024-08-16 15:29:25浏览次数:6  
标签:AGC064C val ll pos 段数 Game Erase maxn define

link

感觉题解说的都很不清晰,这里只谈个人理解。

考虑操作的本质是什么,两人从低到高确定二进制下的每一位填的数,并且场上只保留对应后缀的数字,当场上没有数字时当前操作者输。

设 \(f[i,S]\) 表示确定了前 \(i\) 位,填的数为 \(S\),接下来先手是否能赢,那么有 \(f[i, S] = \neg (f[i + 1, S] \land f[i + 1, S + 2^i])\)。特别的,当不存在数字时,\(f[i, S] = -1\),且如果两个儿子中有一个为 \(-1\),那么 \(f[i, S] = 1\)。

考虑枚举 \(i = 59...0\),直觉告诉我们,\(f[i,\_]\) 的连续段数为 \(O(n)\)。

对于每个 \(i\),我们显然可以将 \(f[i + 1, 0...2^i - 1]\) 和 \(f[i + 1, 2^i ... 2^{i + 1} - 1]\) 通过双指针的方式合并起来。考虑数学归纳法,若 \(i + 1\) 层连续段数为 \(O(n)\),由双指针可得第 \(i\) 层连续段数也是 \(O(n)\)。

时间复杂度 \(O(n\log V)\)。

  • 启示:不要认为极其暴力的 dp 不可行,世上有数百万种 dp 优化的方式。
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pir pair <ll, ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn = 1e6 + 10, P = 60;
ll t, n, pos[maxn], val[maxn], m, _pos[maxn], _val[maxn], _m;
ll l[maxn], r[maxn];
int main() {
	scanf("%lld", &t);
	while(t--) {
		scanf("%lld", &n); m = 0, r[0] = -1;
		for(ll i = 1; i <= n; i++) {
			scanf("%lld%lld", l + i, r + i);
			if(l[i] > r[i - 1] + 1) {
				pos[++m] = r[i - 1] + 1;
				val[m] = -1;
			}
			pos[++m] = l[i];
			val[m] = 1;
		}
		if(r[n] < (1ll << P) - 1)
			pos[++m] = r[n] + 1, val[m] = -1;
		for(ll i = P - 1; ~i; i--) {
			ll x = 1, B = 1ll << i;
			while(x <= m && pos[x] < B) ++x;
			if(x > m || pos[x] > B) {
				for(ll j = m; j >= x; j--)
					pos[j + 1] = pos[j], val[j + 1] = val[j];
				pos[x] = (1ll << i), val[x] = val[x - 1], ++m;
			}
			pos[m + 1] = (1ll << i + 1), _m = 0;
			for(ll j = 1, k = x; j < x; j++) {
				while(pos[k + 1] - B <= pos[j]) ++k;
				while(pos[k] - B < pos[j + 1]) {
					_pos[++_m] = max(pos[j], pos[k] - B);
					if(min(val[j], val[k]) == -1) {
						if(val[j] + val[k] == -2)
							_val[_m] = -1;
						else _val[_m] = 1;
					} else {
						_val[_m] = (val[j] & val[k]) ^ 1;
					} ++k;
				} if(k > x) --k;
			}
			for(ll i = 1; i <= _m; i++)
				pos[i] = _pos[i], val[i] = _val[i];
			m = _m;
		} puts(val[1]? "Takahashi" : "Aoki");
	}
	return 0;
}

标签:AGC064C,val,ll,pos,段数,Game,Erase,maxn,define
From: https://www.cnblogs.com/Sktn0089/p/18362938

相关文章

  • HDU 2999 Stone Game, Why are you always there?
    题目链接:HDU2999【StoneGame,Whyareyoualwaysthere?】思路    由于只能取连续的一段石子,当取出的石子是这段石子的中间一部分时就相当于将一段石子分成两段石子,简单异或一下求SG值就行了代码intsg[N],vis[N],a[N];intn,m,k;voidgetsg(){memset......
  • 基于MonoGame重制《俄罗斯方块》游戏
    两年前,我使用C#基于MonoGame编写了一款《俄罗斯方块》游戏,相关介绍可以参考【这篇文章】。最近,使用业余时间将之前的基于MonoGame的游戏开发框架重构了一下,于是,也就趁此机会将之前的《俄罗斯方块》游戏也重制一次,加入了许多我一直打算加入的功能,甚至包括提供跨平台的版本。先说说......
  • [NSSCTF 2022 Spring Recruit]ezgame
    首先查看本题描述:js分析,源码泄露,信息收集,大致了解了题的解法方向,进入题目页面查看一下,是一个射击游戏,查看源码发现要获得65分才能拿到成绩,一般来说这种游戏基本不可能拿到给定的分数,通常是对源码进行分析然后用bp抓包改包以此来进行分数获得。 结合前面题解的描述,我们先对js文......
  • 【python】pygame开发小游戏原来如此简单,掌握这几步就可以快速上手
    ✨✨欢迎大家来到景天科技苑✨✨......
  • Atcoder nomura2020F Sorting Game
    首先考虑如果固定了\(a\),如何判定这个\(a\)是否能被排序。如果存在\(a_i>a_j(i<j)\),那么\(a_i\)肯定要交换到\(a_j\)后面,那么就肯定会交换\(a_i,a_j\)。于是合法条件就是如果存在\(a_i>a_j(i<j)\),那么\(a_i,a_j\)只相差一个二进制位。那就还能知道此时一......
  • GameSalad-IOS-游戏开发学习手册-全-
    GameSaladIOS游戏开发学习手册(全)原文:LearnGameSaladforiOSGameDevelopmentforiPhone,iPad,andHTML5协议:CCBY-NC-SA4.0零、简介2007年,苹果推出了iPhone,彻底改变了我们的生活方式,但最重要的是iOS的诞生。今天,iOS被用于iPhone、iPad和iPodTouch。通过A......
  • CF1615H-Reindeer Games【保序回归,整体二分,网络流】
    正题题目链接:https://www.luogu.com.cn/problem/CF1615H题目大意有\(n\)个点,每个点有个初始权值\(a_i\),你每次可以让一个点权值\(+1\)或者\(-1\)。有\(m\)个限制要求某个点最终权值小于等于另一个点。求最少的操作次数使得满足所有限制。\(2\leqn,m\leq1000,1......
  • 【倍增】Rigged Games
    题意两队打比赛,大比分2b−1赢,小比分2a−1赢。给定的长度为n的串,两队比赛的每个小分结果是这个串的循环重复。问从该串的每个位置开始,最终谁会赢得整个比赛。思路倍增。首先对于每个位置,计算出它\(2a-1\)局后的比分的比分终点的位置。然后采用倍增,即假设我们要......
  • Interactive Game with Coloring
    看这篇题解解释一下,如果存在一个点通向父亲的边和某一条通向儿子的边的颜色相同,那么一开始如果起点就在这个点的话,是没有办法向上走的,所以任意一个点通向父亲的边和某一条通向儿子的边的颜色不同对于非特殊点,我们只要一直走没有重复出现的那个颜色就好了如果某一时刻走到了特殊......
  • 论文笔记:GeoShapley: A Game Theory Approach toMeasuring Spatial Effects in Machin
    (GeoShapley:机器学习模型中测量空间效应的博弈论方法)话题点:geoshapley、XAI、空间效应、非线性一、引言机器学习和人工智能(AI)越来越多地用于模拟地理空间现象,在各个领域都有很好的表现。可解释人工智能(XAI)领域的最新进展为解释黑箱机器学习提供了一种解决方案。排列特征......