Atcoder ARC-064
ARC064(2020.7.23)
直接贪心即可。
手玩样例可以猜出这样一个结论,如果两端字符相同,如果字符串长度为奇数那么后手赢,否则先手赢,两端字符不同则相反。证明的话先从特殊情况开始入手,假如只存在一种字符出现了多次(除去两端字符的出现次数)因为保证了开始的字符串是合法的,那么这种出现多次的字符出现次数一定不超过字符串长度的一半,于此同时我们要明确一个观点,两个人肯定不会让自己在当前很快输掉,这是显然的,因此两个人都会尽可能往后走,可以发现如果将出现多次的字符全部拿走那么最终的胜利状态将是固定的,那么固定胜利的这个人一定会将这些字符全部拿走因为字符数量少于总长的一半因此他是可以做到的,所以这种特殊情况下上面的结论是正确的。再考虑多种字符出现多次的情况,同样的固定赢的那个人同样可以取走出现多次的那些字符以保证自己必胜,因此上面的结论就正确了。
将原问题中的圆,起点终点都抽象成 \(n + 2\) 个点,两圆之间的距离就是圆心距离减去两圆半径(特殊地如果小于 \(0\) 那么距离为 \(0\)),起点终点和其他圆的距离就是两点之间的距离减去圆的半径,注意还需要考虑从起点直接走到终点的情况,因此还需要在起点和终点之间连边边权为两点间距离,最后跑一遍最短路即可。
看到题目以后我们猜测,是不是所有回文串对答案的贡献都是其长度呢?手玩之后可以发现这个是错的,比如 \(abaaba\) 对答案的贡献显然只有 \(3\),不难发现这种串是有循环节的,那我们又可以大胆猜测所有回文串对答案的贡献是否是其最小循环节的长度呢?实际上这也是不对的,比如 \(abbaabba\) 对答案的贡献其实只有 \(2\) 因为操作两次以后会是一个新的回文串我们也会枚举到,但是我们发现如果最小循环节长度为奇数,那么貌似贡献都是最小循环节长度而如果长度为偶数贡献都是长度除以 \(2\),事实上这个结论是正确的,下面我们来证明这个结论。
下面令 \(r_s\) 为 \(s\) 的反串,最小循环节长度为 \(d\)。
一个回文串的每个循环节也是回文串
这个根据定义很容易可以得出证明。
每进行一次操作相当于对最小循环节进行了一次操作
这个结论也比较显然,手玩可以证明
一个串不论进行多少次操作其最小循环节长度不变
根据上一条性质可以发现,每次我们最小循环节的长度都不会变大,如果我们在某次操作后最小循环节长度变小了,根据我们最开始的定义这个变小的最小循环节的串一定可以再经过若干次操作变回原串,此时最小循环节长度变大,矛盾。
最小循环节长度不同的两个串不会互相影响
上个结论的推论
对一个串执行 \(k\) 次操作和执行 \(d - k\) 次操作后的两个串互为反串
根据性质一二不难得出证明。
一个串如果对答案的贡献会记重当且仅当存在一个 \(k\) 使得 \(k = d - k\)
考虑答案什么时候会被记重,当且仅当执行一些操作后重新变回一个回文串,根据性质一五容易证明。
根据性质 \(4, 5\) 就验证了上面我们对每个回文串对答案贡献的猜想。下面我们只需要考虑如何统计最小循环节为 \(d\) 的回文串数量即可。不难发现一个回文串只要确定前 \(\lceil \frac{d}{2} \rceil\) 个位置的数就可以确定一个回文串,且前 \(\lceil \frac{d}{2} \rceil\) 可以任意填数,但是直接这样计数是不正确的,因为我们要统计的是最小循环节为 \(d\) 的答案,而这样算出来的回文串数量是存在循环节长度为 \(d\) 的数量,因此我们还需要枚举 \(d\) 的约数,将其约数的答案减去即可。
Atcoder ARC-064的更多相关文章
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
- AtCoder ARC 076E - Connected?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的 ...
- AtCoder ARC 076D - Built?
传送门:http://arc076.contest.atcoder.jp/tasks/arc076_b 本题是一个图论问题——Manhattan距离最小生成树(MST). 在一个平面网格上有n个格点, ...
- AtCoder ARC 082E - ConvexScore
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c 本题是一个平面几何问题. 在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n} ...
- Atcoder ARC 082C/D
C - Together 传送门:http://arc082.contest.atcoder.jp/tasks/arc082_a 本题是一个数学问题. 有一个长度为n的自然数列a[1..n],对于每一 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
题目传送门:ARC090E. 题意简述: 给定一张有 \(N\) 个点 \(M\) 条边的无向图.每条边有相应的边权,边权是正整数. 小 A 要从结点 \(S\) 走到结点 \(T\) ,而小 B 则 ...
- 【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
随机推荐
- HMS Core电商与游戏行业解决方案,全流程赋能开发者创新
2021年12月29日,"华为云&华为终端云服务创新峰会2022"在北京柏悦酒店成功举办.华为HMS Core电商与游戏行业解决方案亮相本次峰会的线下展区,为行业开发者们解 ...
- Adversarial Detection methods
目录 Kernel Density (KD) Local Intrinsic Dimensionality (LID) Gaussian Discriminant Analysis (GDA) Gau ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- c++—通讯录管理系统
一.运用所学的结构体.地址指针等基础知识,完成通讯录管理系统 二.系统主要有以下6个功能: 1.添加联系人2.显示联系人 3.删除联系人 4.查找联系人5.修改联系人 6.清空联系人 1 #inclu ...
- 编写Java程序,测试包的使用和成员的访问权限
返回本章节 返回作业目录 需求说明: 测试包的使用和成员的访问权限: 分别创建两个包,在这两个包下分别建立两个类. 其中某个类的某个方法需要引用用另一个包中某个类的某些成员属性. 被引用成员属性分别使 ...
- linux 之 导出远程oracle数据库表结构及数据
导出用户下所有表结构及数据 exp 用户名/密码@ip/数据库 file=文件路径/文件名.dmp owner='用户' 导出用户下所有表结构,不导出数据 exp 用户名/密码@ip/数据库 file ...
- python @property用法(转载)
偶然碰到一篇讲解 @property 比较清晰的文章 记录下来 日常复习 # @property'''@property是python的一种装饰器,是用来修饰方法的 作用:我们可以使用@propert ...
- DRF框架在嵌套关系下实现嵌套对象字段的过滤
当需要对关联对象的字段进行选择性显示时,在所对应的serializer类中声明引用的字段. 例如: class TrackSerializer(serializers.ModelSerializer) ...
- 初识python 之 爬虫:爬取豆瓣电影最热评论
主要用到lxml的etree解析网页代码,xpath获取HTML标签. 代码如下: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:20 ...
- 初识python:高阶函数(附-高阶函数)
定义: 变量可以指向函数,函数的参数能接收变量,那么,一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. 简单说就是:把函数当作参数传递的函数就是高阶函数 特性 1.把一个函数名当作实参传 ...