AGC040
AGC040
A
模拟。
B
因为顺序无关紧要,所以可以先把区间按右端点排序方便处理。
设第一个区间在\(A\)集合,考虑枚举第一个在\(B\)集合的区间\(i\),这样两个集合的右端点\(\min\)就确定了。再考虑\(i\)后面的区间中左端点最大的那个,假设它在\(A\)集合,那么把\(i\)后面的区间都放进\(A\)集合一定不劣,\(B\)集合同理。也就是说,最优方案一定形如:要么一段前缀在\(A\)集合一段后缀在\(B\)集合,要么\(B\)集合只有一个区间。
C
首先可以黑白染色,偶数位置的\(A\)变成\(B\),\(B\)变成\(A\)。问题变成不能删\(AA\)和\(BB\)。
然后我的想法是考虑删除所有\(C\),要求存在一种删除方案使得剩下的字符串中\(A,B\)个数相等,求合法字符串数,不太会做。然后我就打开了题解,发现我是个sb,其实只要字符串中\(A,B\)的个数分别\(\le \frac{n}{2}\)就行了。
D
对于一种排列,显然满足Ringo从\(p\)开始时Snuke能获胜的\(p\)是一段前缀。
画一条折线,\(x\)是距离,\(y\)是用时。那么将Ringo的折线垂直移动,使得它与Snuke的折线恰好有一个交点时,它与\(x\)轴的交点横坐标就是最大的\(p\)。
枚举\((p,0)\)处对应的是哪一条线段,设为\(k\)。考虑这么一条折线\(C\):
从\((p,0)\)出发,沿着Ringo的折线走到两条折线的交点处,再沿着Snuke的折线走到\((n,s)\),其中\(s=\sum a_i\)。
容易发现每一种方案一定可以找出这么一条折线,且这么一条折线(从某个\((x,0)\)开始,先以斜率\(b_i\)向右上走,在某个点后变为以斜率\(a_i\)向右上走,走到\((n,s)\))能对应一种方案。\(p\)要尽量大,也就是说\(C\)要包含尽量少的线段,所以\(C\)上升的越快越好。
考虑一条放在\(k\)右边的线段\(i\)。\(i\)最多使\(C\)上升\(\max(a_i,b_i)\),而这个上界是可以达到的,只要把\(a_i < b_i\)的放在两折线交点前面,其他的放在交点后面即可。那么找出除\(k\)外\(\max(a_i,b_i)\)最大的若干个线段,假设有\(q\)个,要求\(b_k\)加这些线段的\(\max(a_i,b_i)\)之和\(\ge s\),且\(q\)尽量小。那么对于这个\(k\),\(C\)中包含线段数的整数部分就是\(q\),小数部分特殊计算一下即可。
E
先考虑简化版本,如果只有1操作怎么做?显然答案是\(a_i > a_{i+1}\)的个数。
再考虑原问题,考虑最终序列是怎样形成的。可以发现每一个位置的数都是若干次1操作和若干次2操作加出来的。那么每一个\(A\)可以拆成\(x+y\),\(x\)表示1操作对这个位置的贡献,\(y\)同理。那么问题就变成了,要决定序列\(x,y\),满足\(x_i+y_i=A_i\),\(x_i > x_{i+1}\)有\(1\)的代价,\(y_i < y_{i+1}\)有1的代价,求代价最小值。
朴素的想法就是DP,\(f_{i,j}\)表示前\(i\)个数,\(x_i=j\)的最小代价。然后我又sb了,打开题解,显然\(f_{i,0} \le f_{i,A_i}+2\),维护转折点就行了。
F
可以规定两点距离\(\ge 2\)时才能对较左边的点用\(1\)操作,就变成了操作序列计数。
记\((x,d)\)表示较右边的点在\(x\)处,两点距离为\(d\)。那么操作有三种:
1.\(++x,++d\)。
2.当\(d \ge 2\)时,\(--d\)。
3.设置\(d=0\)。
1操作一定执行\(b\)次,考虑枚举2操作的次数\(k\)。注意到一个合法的操作序列(合法定义为每次执行2操作时\(d \ge 2\))删掉所有3操作后一定也合法,那么可以考虑先排列所有\(1,2\)操作,再往里面插入\(n-b-k\)个\(3\)操作。考虑\(3\)操作插在哪些位置可以使序列合法且最终两点分别在\(a,b\)处。有几点限制(以下\(d'\)指忽略所有3操作得到的\(d\)):
1.结束后\(d=b-a\)。这说明最后一次3操作之前一定满足\(d'=a-k\)。
2.任意时刻\(d \ge 2\)。这说明如果要在某个\(d'=k\)的位置后面插入一个\(3\)操作,那么这个位置后面不能出现\(d' \le k\)的位置。
也就是说,可以在最后一次\(d'=0,1,2,\dots,a-k\)的每个位置后面插入任意多个3操作,要求\(d'=a-k\)后面至少插入一个3操作。注意到这与1,2操作具体是怎样排列的无关,所以排列1,2操作和插入3操作是独立的。排列1,2操作的方案数就是一个基础的格路问题,插入3操作的方案数就是一个隔板法。
AGC040的更多相关文章
- AGC040 Task C. Neither AB Nor BA
Observations 对一个长为 $2N$ 的序列重复下述操作:取走两个相邻且不同的元素.最后能把序列取空的充要条件是序列中不存在出现超过 $N$ 次的元素. 证明:必要性,取 $N$ 次最多能取 ...
- 【做题记录】AtCoder AGC做题记录
做一下AtCoder的AGC锻炼一下思维吧 目前已做题数: 75 总共题数: 239 每一场比赛后面的字母是做完的题,括号里是写完题解的题 AGC001: ABCDEF (DEF) AGC002: A ...
- HPU personal training
K - Two Contests 原题链接:https://agc040.contest.atcoder.jp/tasks/agc040_b?lang=en 题目大意: 给一个区间集合,将这些区间分为 ...
- K - Two Contests
题目连接:https://atcoder.jp/contests/agc040/tasks/agc040_b 大佬题解:https://blog.csdn.net/duanghaha/article/ ...
随机推荐
- Java中使用MATLAB作图 .
最近做一个项目,需要很多进行很多信号处理——小魏就是学软件的,对信号处理简直是个小白,最简单的实现就是傻瓜似的调用MATLAB的各种工具箱,达到目的就行. 同时,MATLAB是种解释性语言,执行效率比 ...
- Delphi XE2 之 FireMonkey 入门(14) - 滤镜: 概览
相关单元: FMX.Filter FMX.FilterCatBlur FMX.FilterCatGeometry FMX.FilterCatTransition FMX_FilterCatColor ...
- Delphi XE2 之 FireMonkey 入门(12) - 动画(上)
在 HD 窗体上添加一个 TAniIndicator, 修改其 Enabled 属性为 True, 动画完成了. 这是最简单的动画相关的控件了, 只有两个值得注意的属性: Enabled: Boole ...
- python 基础lambda函数
lambda 函数 其实对应的是一个简单的表达式: lambda [arg1] : expression a = lambda x,y: (x+y)/2 等价于 def a(x,y): (x+y)/2 ...
- myeclipse 2015 myeclipse2010破解共存
1.高版本选择bling版本,低版本选择profession版本2.用高版本的公钥替换低版本的公钥3.先破解低版本的后破解高版本的4.最后用高版本的替换低版本的文件
- 重置Docker里的gitlab管理员用户密码
1.docker ps 找出容器的唯一标识 2.docker exec -it ad9b8c3e20f0 /bin/bash 进入Docker容器运行环境 3.开始重置gitlab管理员用户密码 ...
- js技巧之与或运算符 || && 妙用
如题: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码 ...
- WPF资源字典的使用
1.在解决方案中添加资源字典:鼠标右键——添加——资源字典 2.在资源字典中写入你需要的样式,我这里简单的写了一个窗体的边框样式 3.在App.xaml中加入刚刚新建的资源字典就好了
- 工作中常见的hive语句总结
hive的启动: 1.启动hadoop2.开启 metastore 在开启 hiveserver2服务nohup hive --service metastore >> log.out 2 ...
- html表格单元格添加斜下框线的方法
一.分隔单元格的方法 1.用“transform: rotate(-55deg);”把一条水平线旋转一定角度就成斜线了 2.利用以下命令调整分割线位置等. :after :before transfo ...