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 ...
随机推荐
- 『学了就忘』vim编辑器基础 — 97、vim使用技巧
目录 1.在vim中导入其他文件内容或命令结果 (1)导入其他文件内容 (2)在vim中执行系统命令 (3)导入命令结果 2.设定快捷键 3.字符替换 4.多文件打开 vim使用技巧,就是vim编辑器 ...
- 【jvm】05-为什么你写的代码有时候和预期不一致
[jvm]05-为什么你写的代码有时候和预期不一致 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请 ...
- MySQL创建数据库 easyShopping,包括area表、goods表、customer表、orders表、ordersdetall表、test表
MySQL创建数据库 easyShopping,包括area表.goods表.customer表.orders表.ordersdetall表.test表 商品表表结构: 字段名 说 明 类 型 长 度 ...
- Linux查看CPU详细信息
1.查看CPU详细信息 在Linux服务器上查看CPU详细信息: cat /proc/cpuinfo 输出结果: processor : 0 vendor_id : GenuineIntel cpu ...
- Linux下设置普通用户使用sudo命令
1.登录root用户 2.增加root用户对文件sudoers的写权限 chmod u+w /etc/sudoers 3.编辑sudoers,把用户mysql添加进去 vi /etc/sudoers ...
- PHP 中的回调函数
回调函数就是在主进程执行过程中,满足某个条件后,跳转到预先设置好的函数中去执行的一种函数. 举例说明: 张三到一个水果店买苹果,刚好苹果卖完了,于是张三在店员那里留下了自己的电话,一个小时后店里有货了 ...
- Linux上天之路(十二)之服务管理
主要内容 服务介绍 独立服务 非独立服务 1. 服务介绍 服务:常驻在内存中的程序,且可以提供一些系统或网络功能,那就是服务. 计算机中的系统服务有很多,比如: apache提供web服务 ftp提供 ...
- Go语言系列- Socket编程和Redis
Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的 ...
- 【Maven】maven 插件开发实战
前言 众所周知,maven 实质上是一个插件执行框架,所有的工作都是通过插件完成的.包括我们日常使用到的类似 install.clean.deploy.compiler...这些命令,其实底层都是一个 ...
- Antd使用timePicker封装时间范围选择器(React hook版)
antd中提供了是日期范围选择器及datepaicker封装日期范围选择器的示例,但是没有时间选择范围的组件,这里使用两个timePicker组合一个事件范围选择器,通过disabled属性限定时间可 ...