首页 > 其他分享 >容易的多元拉格朗日反演练习题

容易的多元拉格朗日反演练习题

时间:2024-07-26 12:51:39浏览次数:18  
标签:练习题 拉格朗 奇数 Alice 位上 偶数 反演 枚举 Bob

你说得对,但确实和题目没有一点关系。

模拟赛记录下午出。

题面

image

看到 Alice 和 Bob 就知道是什么题了。

思路

这个题开始先胡乱想想,发现按照博弈论的思路,那么每次 Bob 行动一步后,Alice 需要有对应的策略,也就是说,若 Alice 必胜,这次行动应该是固定的最优策略步。

然后再代入一下,如果你是 Alice,每次肯定是优先拿去较小的数,这样才能获得更大的操作空间。

然后 Bob 为了阻止你胜利,同样也会拿较小的数,这样就得到了我一开始的错误的想法:把数按非降序排列后,若奇数位的和满足属于区间 \(\left[l,r\right]\),则 Alice 必胜。

但思考一下就能知道这是个错解,例:

4 5 6
1 3 5 6

这种情况下,Alice 只有拿到 \(1\) 和 \(5\) 才能胜利,而它们恰好都在奇数位上,所以按如上思路答案是 Alice,但只要 Bob 拿到其中一个 Alice 就不可能赢了。

于是考虑转换思路。我们发现,\(n\) 为偶数时没有什么突破口,比如上面的例子中 Bob 的最优策略就不再是固定于某几个位置上的数。那么尝试考虑 \(n\) 为奇数时,Alice 赢,Bob 先行动的情况,那么此时主动权就来到了 Bob 手上,他每次行动后,Alice 会有一个最优策略来应对 Bob 的行动。

这样的话,整个数列会被分成若干个数对和一个剩余的数。不难发现,数列中相邻的两个数配对是 Alice 赢的最好策略。那么再结合上面假了的猜想,Bob 每次取任意一个数,那么Alice 的最优策略就是选与 Bob 配对的另一个数。

现在的局面是,Bob 具有主动权(先手),而最后剩余的数是 Alice 决定的,因此我们可以枚举最后剩余的数,这样 Alice 所选数之和的上下边界就确定了,因而可以得出在该情况下,Alice 是否必胜的结论。

分别求出奇数位和偶数位上的和,枚举每次最后剩余的数,由于它可能会影响数位上的数的变化,我们对于每类数位要开两个变量,在这里先统称为 \(A\) 与 \(B\),表示奇数位和与偶数位和,那么显然 \(SumAlice\) 只能取到这个范围内的值,因此若 \(l\le A\) 并且 \(B\le r\),那么 Alice 是必胜的。

现在已经得到了 \(n\) 为奇数,Bob 先手的做法。迁移到 \(n\) 为偶数上,我们只要先排去 Alice 先手的那一步不就可以了吗。所以先枚举 Alice 先手所选的数,(当然超过 \(r\) 的数选了直接就寄了,这时候结束枚举就行了),再枚举最后剩下的那个数,求出奇偶数位上值的和,按上述方法判断即可,这里判断要加上开始枚举的 Alice 首选的那个值。复杂度是 \(\mathcal{O(n^2)}\) 的,\(n\le 5000\),显然能过。

还有,注意 \(a_i\) 的值域是 \(10^9\) 级别的,计算和的时候要开 long long

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Ratio=0;
const int N=5005;
int T,n;
ll l,r,a[N],b[N];
namespace Wisadel
{
	short main()
	{
		scanf("%d",&T);
		while(T--)
		{
			scanf("%d%lld%lld",&n,&l,&r);
			bool Alicewin=0;
			for(int i=1;i<=n;i++) scanf("%d",&a[i]);
			sort(a+1,a+1+n);
			for(int i=1;i<=n;i++)
			{// 先枚举 Alice 首选
				if(a[i]>r) break;
				ll jied=a[i],oued=a[i],ji=0,ou=0;
				// 分别表示枚举过和未枚举的奇偶数位之和,这里提前就把 a[i] 加上了
				// 这里枚举与否取决于最下面循环的进行程度,感性理解一下
				for(int j=1;j<=n;j++)
					if(i!=j) b[(j>i?j-1:j)]=a[j];
				for(int j=1;j<n;j++)
					if(j&1) ji+=b[j];
					else ou+=b[j];
				for(int j=1;j<n;j++)
				{// 枚举最后剩下的数
					if(j&1) ji-=b[j];
					else ou-=b[j];
					if(l<=jied+ou&&oued+ji<=r)
					{
						Alicewin=1;
						break;
					}
					if(j&1) jied+=b[j];
					else oued+=b[j];
				}
				if(Alicewin) break;
			}
			if(Alicewin) printf("Alice\n");
			else printf("Bob\n");
		}
		return Ratio;
	}
}
int main(){return Wisadel::main();}

代码中有一句 if(l<=jied+ou&&oued+ji<=r),赛时调了好一会才改出来。如果你枚举的这个数是奇数位上的,那么之后的奇数位数之和其实是开始的偶数位数之和,偶数位上的数同理。无论如何,二者上下界关系没有变。

更详细的解释

若枚举一个奇数位上的数:

此后的奇数位上的数就是原来偶数位上的数,是答案下界,而偶数位上的数自然就是原来奇数位上的数,是答案上界。

若枚举一个偶数位上的数同理。

更简单的想,我们无论抽走哪一个数,都会使之后的数发生整体的数位奇偶变化,我们开始求得的奇偶数位上数之和其实一直是反的。

还不理解的话建议手模一组数据,1 2 3 5 6 7 就行(已经不算 Alice 先手)。


完结撒花~

没想到是唯一 A 的啊,明天 Alice 和 Bob 主场,期待一手四道博弈论。

轻井泽可爱捏~

标签:练习题,拉格朗,奇数,Alice,位上,偶数,反演,枚举,Bob
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18325075

相关文章

  • 【C语言基础习题】C语言练习题——bite 寒假班作业(4)
    C语言练习题——bite寒假班作业(4)题目第1题(单选题)题目名称:下面代码执行的结果是:()#include<stdio.h>intmain(){inti=0;for(i=0;i<10;i++){if(i=5)printf("%d",i);}return0;}题目内容:A.12345678910B.5555555555C......
  • 高级爬虫练习题及答案
    引言在当今的数据驱动世界,爬虫已经成为获取网络数据的重要工具。通过爬虫,我们可以从各种网站中提取信息,进行数据分析,支持决策。然而,爬虫技术不仅仅限于简单的网页抓取,还涉及到处理动态内容、反爬虫机制以及大规模数据提取等复杂问题。本文将介绍几个高级爬虫练习题,并附上详细......
  • Java语言程序设计基础篇_编程练习题**15.17 (几何问题:寻找边界矩形)
    **15.17(几何问題:寻找边界矩形)请编写一个程序,让用户可以在一个二维面板上动态地增加和移除点,如图15-29a所示。当点加入和移除的时候,一个最小的边界矩形更新显示。假设每个点的半径是10像素解题思路:这道题可以从编程练习题15.15修改新建一个面板Pane(),方法外部新建一个......
  • 莫比乌斯函数与莫比乌斯反演
    9.莫比乌斯函数与莫比乌斯反演9.1莫比乌斯函数9.1.1定义设\(\mu\)为莫比乌斯函数,则有:\[\mu(x)=\begin{cases}1\qquad(n=1)\\0\qquad(∃\i\(ki=x,k\inZ\rightarrow\sqrt{i}\inZ))\\(-1)^{\sum_{i\inprime}[i\midx]}\end{cases}\]直观地说,只要\(x\)的某个质......
  • Solution Set - 容斥原理/二项式反演
    https://www.becoder.com.cn/contest/5400「BZOJ2863」愤怒的元首题目就是求\(n\)个点DAG的数量。设\(dp_i\)表示\(i\)个点的DAG数量。首先DAG一定存在出度为\(0\)的点,其次删去出度为\(0\)的点,仍构成一个DAG。所以我们可以枚举删去的数量,从而划分子问题。......
  • 基于Python星载气溶胶数据处理与反演分析
    在当前全球气候变化和环境污染问题日益突出的背景下,气溶胶研究显得尤为重要。气溶胶在大气中由直径范围在0.01微米至10微米固体和液体颗粒构成,直接或间接影响地球辐射平衡、气候变化和空气质量。尤其在“碳中和”目标的驱动下,研究气溶胶对“碳中和”的气候影响及其环境效应,不仅......
  • 【笔记】Set - 容斥原理/二项式反演
    https://www.becoder.com.cn/contest/5400「BZOJ2863」愤怒的元首题目就是求\(n\)个点DAG的数量。设\(dp_i\)表示\(i\)个点的DAG数量。首先DAG一定存在出度为\(0\)的点,其次删去出度为\(0\)的点,仍构成一个DAG。所以我们可以枚举删去的数量,从而划分子问题。......
  • 基于MATLAB的从图像反演SAR原始回波【持续更新】
    一、概论当前在网上公开的SAR数据大部分都是聚焦过后的SLC图像,对想研究成像原理的朋友十分不友好,该文章提出了一种基于图像进行反演SAR原始回波的方法。二、SAR原理介绍想要理解SAR的原理,需要先了解两个基本概念1、多普勒效应多普勒效应(Dopplereffect)是为纪念奥地......
  • 莫比乌斯反演
    前置知识:积性函数。定义:一个函数\(f\),若\(\forall\gcd(a,b)=1\),都有\(f(a)\timesf(b)=f(a\timesb)\),则它是积性函数。一个函数\(f\),若\(\forall(a,b)\),都有\(f(a)\timesf(b)=f(a\timesb)\),则它是完全积性函数。正题狄利克雷卷积先放一张图方便下文理解(copyz......
  • 练习题三(7.17)
    任务1、新增账号zhangsanlisiwangwuzhaoliuaaabbbcccddd [root@2~]#useraddzhangsan [root@2~]#useraddlisi [root@2~]#useraddwangwu [root@2~]#useraddzhaoliu [root@2~]#useraddaaa [root@2~]#useraddbbb [root@2~]#useraddccc......