博弈论练习1

博弈论练习1

\;

1.ProjectEuler306 Paper-strip Game

题目描述

Solution

SG[i]SG[i]SG[i]表示连续iii个格子的SGSGSG值。
SG[0]=SG[1]=0SG[i]=mexj=0n−2{SG[j]xorSG[i−j−2]}SG[0]=SG[1]=0 \\ SG[i]=mex_{j=0}^{n-2}\{SG[j]\;\;xor\;\;SG[i-j-2]\} SG[0]=SG[1]=0SG[i]=mexj=0n2{SG[j]xorSG[ij2]}
直接暴力时间复杂度O(n2)O(n^2)O(n2)
打表找规律,发现有34位的循环节,之后O(n)O(n)O(n)求解答案即可。

\;

2.AGC002E-Candy Piles

题目描述

Solution

本题有两种操作:
1.整体减1。
2.删除最大的数。

我们把数从大到小排序,按数的大小柱形图,相当于每次可以删掉底行或删掉首列,f[i][j]f[i][j]f[i][j]表示已经删除前iii行前jjj列的胜负状态,发现每一个对角线的fff值都是相同的。

因此直接从起点走到轮廓线判断奇偶性即可。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int a[MAXN];
int main()
{int n=read();for (int i=1;i<=n;i++) a[i]=read();sort(a+1,a+n+1,greater<int>());for (int i=0;i<=n;i++)if (i+1>a[i+1]){int r=i;while (a[r+1]==i) r++;puts((((a[i]-i)&1)||((r-i)&1))?"First":"Second");break;}return 0;
}

3.CF1110G. Tree-Tac-Toe

题目描述

Solution

首先,后手是个弟弟,他永远不能赢QAQQAQQAQ
因此考虑什么时候先手必胜:
1.若有一个度数为4及以上的结点,则先手必胜。
2.若有一个度数为3的结点,它的子节点的度数至少为1,2,2,则先手必胜。
3.若有存在3个以上度数为3的结点,必然存在条件2,则先手必胜。
4.若仅有2个度数为3的结点,则若他们之间的距离是偶数,则先手必胜。

否则必然平局。
O(n)O(n)O(n)实现分类讨论即可。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=2000005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
char st[MAXN];
int n,nodenum,d[MAXN];
vector<int> e[MAXN],V[MAXN];
void add_edge(int u,int v)
{e[u].PB(v),e[v].PB(u);d[u]++,d[v]++;
}
int dfs(int x,int father,int dep,int y)
{if (x==y) return dep&1; for (auto v:e[x]){if (v==father) continue;int q=dfs(v,x,dep+1,y);if (q!=-1) return q;}return -1;
}
bool solve()
{for (int i=1;i<=nodenum;i++) {if (d[i]>=4) return 1;V[d[i]].PB(i);}if (V[3].size()>=3) return 1;if (V[3].size()==2&&dfs(V[3][0],0,1,V[3][1])) return 1;for (auto x:V[3]){	int cnt1=0,cnt2=0;for (auto v:e[x]) if (d[v]>=2) cnt2++;if (cnt2>=2) return 1;}return 0;
}
int main()
{int Case=read();while (Case--){n=nodenum=read();for (int i=1;i<n;i++){int u=read(),v=read();add_edge(u,v);}scanf("%s",st+1);for (int i=1;i<=n;i++)if (st[i]=='W'){nodenum+=3;add_edge(i,nodenum-2);add_edge(nodenum-2,nodenum-1);add_edge(nodenum-2,nodenum);}puts(solve()?"White":"Draw");for (int i=1;i<=nodenum;i++) e[i].clear(),V[i].clear(),d[i]=0;}return 0;
}

4.CF388C. Fox and Card Game

题目描述

Solution

这题虽然是Div.1CDiv.1CDiv.1C但是很简单啊。

这个博弈游戏中,先手想要拿到最大的权值和,而后手的目的是尽可能地阻止先手拿到大的权值。

考虑每一行的数,倘若先手拿到a[(n+1)/2+1...n]a[(n+1)/2+1...n]a[(n+1)/2+1...n]中的某一个数能拿到最优解,那么先手必然会阻止他拿到他想拿到的那个数,换句话说,在后手刻意而为的情况下,先手永远拿不到每一行中的a[(n+1)/2+1...n]a[(n+1)/2+1...n]a[(n+1)/2+1...n]这些数。

对于nnn为偶数,先手能拿的只有前n/2n/2n/2个。
对于nnn为奇数,先手必然能拿的是前n/2n/2n/2,并剩下最中间一个数。对于每一个奇数行剩下的数从大到小排序,先手必然可以选到排序后奇数位上的数,剩下的数全部由后手选到。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<int> V;
int main()
{int n=read(),ans1=0,ans2=0;for (int i=1;i<=n;i++){int x=read();for (int j=1;j<=x;j++)if (j<=x/2) ans1+=read();else if (j==(x+1)/2) V.PB(read());else ans2+=read();}sort(V.begin(),V.end(),greater<int>());for (int i=0;i<V.size();i++)if (i&1) ans2+=V[i];else ans1+=V[i];printf("%d %d\n",ans1,ans2);return 0;
}

5.CF388C. Fox and Card Game

题目描述

Solution

答案必然集中在序列的中间几个数中。
先手先进行kkk次操作会让答案区间平移若干格,直接维护即可。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=600005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
int a[MAXN],dp1[MAXN],dp2[MAXN],ans[MAXN];
int main()
{int n=read();for (int i=1;i<=n;i++) a[i]=read(),upmax(ans[1],a[i]);for (int i=1;i<n;i++) upmax(dp1[min(i,n-i)],max(a[i],a[i+1]));for (int i=2;i<n;i++) upmax(dp2[min(i-1,n-i)],max(min(a[i-1],a[i]),min(a[i],a[i+1])));for (int i=n/2;i>=1;i--) ans[i<<1]=max(ans[(i+1)<<1],dp1[i]),ans[i<<1|1]=max(ans[(i+1)<<1|1],dp2[i]);for (int i=n;i>=1;i--) printf("%d ",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core IoT 入门指南:(三)使用 I2C 进行通信

什么是 I2C 总线I2C 总线&#xff08;Inter-Integrated Circuit Bus&#xff09;是设备与设备间通信方式的一种。它是一种串行通信总线&#xff0c;由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线&#xff0c;一根…

圆方树

圆方树 单纯贴个板子。。。 https://loj.ac/problem/2587 #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algor…

浅淡Kubernetes 与容器技术体系的最佳方法

我们已经进入到容器化时代&#xff0c;Kubernetes成为了市场上容器编排的事实标准&#xff0c;而且k8S 同样具备了微服务所需要的服务注册与发现、负载均衡、配置中心。Spring cloud 的核心是Netflix微服务框架&#xff0c;非常成熟&#xff0c;但是在netflix oss开发初期&…

单位根反演题单

单位根反演题单 LOJ#6485. LJJ 学二项式定理 单位根反演。 bzoj 3328 PYXFIB 单位根反演矩阵乘法。 POJChallengeRound2 Guideposts 求图上路径长度为k的倍数的方案数。 单位根反演矩阵乘法。 #include <vector> #include <list> #include <map> #inc…

.NET Core 批量重置 Azure Blob Storage 的 mime type

点击上方蓝字关注“汪宇杰博客”我的博客使用 Azure Blob Storage 存储文章配图&#xff0c;结果今天玩 Azure CDN 的时候爆了&#xff0c;原因是图片mime type不对。我们来看看如何在 .NET Core 里批量重置 Azure Blob Storage 中文件的mime type吧。起因使用编程方式&#xf…

AGC026E - Synchronized Subsequence

AGC026E - Synchronized Subsequence 题目描述 Solution 定义cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]表示在前xxx个数中0的个数和1的个数分别是多少。 然后把整个串sss划分为若干个子串&#xff0c;划分点在所有cnt[i][0]cnt[i][1]cnt[i][0]cnt[i][1]c…

[NewLife.XCode]实体工厂(拦截处理实体操作)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

AGC027D - Modulo Matrix

AGC027D - Modulo Matrix 题目描述 Solution 有一个显然的想法是先填一部分格子&#xff0c;剩下的格子的即为相邻格子的LCM1LCM1LCM1&#xff0c;但这样填写的数呈指数级增长&#xff0c;并不优秀。 我们发现一个格子的数是否可以填写只和相邻的四个格子有关系&#xff0c…

DDD该怎么学

2006年&#xff0c;国内的互联网才刚刚萌芽&#xff0c;人们甚至还不习惯网购&#xff0c;大多数在校生都在宿舍里刷魔兽世界副本。但企业软件开发却得到了蓬勃发展&#xff0c;各种公司和事业单位都纷纷进行信息化转型。然而人们很快发现&#xff0c;企业应用业务逻辑的复杂度…

博弈论练习2

博弈论练习2 \;1.AGC010F - Tree Game 题目描述 Solution 一道简单博弈题&#xff08;不知道为啥能作为AGC的F题&#xff09;。 考虑树形dpdpdp&#xff0c;设f[x]f[x]f[x]表示以xxx为根的子树中是否先手必胜。 则f[x]1f[x]1f[x]1当且仅当能找到xxx的子节点vvv满足f[v]0f[v…

Net Core下使用RabbitMQ比较完备两种方案(虽然代码有点惨淡,不过我会完善)

一、前言上篇说给大家来写C#和Java的方案&#xff0c;最近工作也比较忙&#xff0c;迟到了一些&#xff0c;我先给大家补上C#的方案。二、使用的插件HangFire一个开源的.NET任务调度框架&#xff0c;最大特点在于内置提供集成化的控制台,方便后台查看及监控&#xff0c;支持多种…

利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑

最近项目上试运行发现&#xff0c;很多时候网站出了问题或者某个功能不正常&#xff0c;常常需要运维人员去服务器里面查看一下日志&#xff0c;看看日志里面会产生什么异常&#xff0c;这样导致每次都要去远程服务器很不方便&#xff0c;有时服务器是客户保管的不能让我们随意…

后缀数组SA

后缀数组SA 模板 花了不少时间才理解倍增求SASASA的实现方法&#xff0c;我还是太菜了。 定义sa[i]sa[i]sa[i]表示排名为iii的后缀的起始位置。 定义rank[i]rank[i]rank[i]表示起始位置为iii的后缀的排名。 显然两者之前互逆。 void solve() {int m122;for (int i1;i<m;…

使用.NET Core 编写端到端测试

什么是端到端测试端到端测试也称E2E,与单元测试、集成测试、组件测试、契约测试相比&#xff0c;端到端测试的目的是验证整个系统是否满足业务目标&#xff0c;而不管使用的组件架构如何&#xff0c;为了实现这一点&#xff0c;系统被视为一个黑盒子&#xff0c;测试尽可能多地…

Manacher

Manacher(马拉车算法) Manacher算法主要用于求解回文串问题&#xff0c;能够统计出以每一个位置为中心的回文串的个数&#xff0c;效率极高。 模板 题目描述 Manacher算法的实现过程&#xff1a; 1.在字符串每两个字符之间插入一个分隔符。 2.iii从111到nnn求解P[i]P[i]P[i…

.NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 )...

如果你使用过 WPF/UWP 等 XAML UI 框架&#xff0c;那么应该了解到附加属性的概念。那么没有依赖属性支持的时候如何做附加属性的功能呢&#xff1f;你可能会想到弱引用。但这需要做一个弱引用字典&#xff0c;要写的代码还是非常麻烦的。本文介绍 .NET 的 ConditionalWeakTabl…

P4548 [CTSC2006]歌唱王国

P4548 [CTSC2006]歌唱王国 题目描述 Solution 这一题在《具体数学&#xff08;混泥土数学&#xff09;》里讲得很详细了啊&#xff0c;这里相当于总结一下&#xff0c;想具体了解的直接看书吧。 我们先考虑字符集为222的情况&#xff0c;设硬币正面朝上(H)(H)(H)的概率为pp…

在C#中使用Json.Net进行序列化和反序列化及定制化

序列化&#xff08;Serialize&#xff09;是将对象转换成字节流&#xff0c;并将其用于存储或传输的过程&#xff0c;主要用途是保存对象的状态&#xff0c;以便在需要时重新创建该对象&#xff1b;反序列化&#xff08;Deserialize&#xff09;则是将上面的字节流转换为相应对…

SRM614 Div1 Hard

SRM614 Div1 Hard 题目描述 Solution 显然有&#xff1a; E(x,y)(E(x−1,y)E(x,y−1))/21E(x,y)(E(x-1,y)E(x,y-1))/21 E(x,y)(E(x−1,y)E(x,y−1))/21 直接高斯消元时间复杂度O((nm)3)O((nm)^3)O((nm)3)。 可以发现这种做法十分浪费&#xff0c;消元之后会有大量冗余元素&…

知乎个人精选 | 绝版的专业书到哪里找最快最高效?

估计书到用时方恨少是很多软件开发人员的苦恼&#xff0c;当然我这里提到的"少"表示稀少&#xff0c;买不到之意~比如你加入一家政府机构或给为政府机构服务的公司做开发&#xff0c;主要做传统软件&#xff0c;对方需要使用 Win Forms做开发&#xff0c;你打算系统性…