CSPS_103
被sdfz踩爆了!
%%%kai586123
%%%Gekoo
%%%sdfz_yrt
T1
我以为是水题!一直在肝!
而且为什么每次我的考场暴力都是考后才调出来啊!!
先记录一下正解的大神做法:
按顺序考虑每次出牌,每次要出使总胜数不变的最大的牌
考虑将a和b的牌放在一起排序,那么这个问题变成了:括号匹配
那么考虑对于一个左括号,每次找一个最靠右的右括号与他匹配(或不匹配),还使得总对数不变
如果找到的右括号在它右边,那么如果找到的当前位置i的右括号导致对数减少,找到更右的位置i+k一定也导致对数减少
这点可以直观理解,因为i位置导致对数减少,说明左侧的左括号找不到任何替代的右括号,也说明右侧没有任何“空闲”的括号
所以出牌的大小对对数的影响有可二分性,问题变成了如何快速维护剩余对数
Rockstar_B:线段树维护分治
考虑在值域线段树上维护对数,给每个节点维护2个变量sum[2]和pair表示这个值域区间里“空闲”左括号和右括号的数量和匹配数
修改后递归回来维护:
int now=min(sum[lch][0],sum[rch][1]);
pair[x]=pair[lch]+pair[rch]+now;
sum[x][0]=sum[lch][0]+sum[rch][0]-now;
sum[x][1]=sum[lch][1]+sum[rch][1]-now;
最后对数就是 pair[1]
然后记录下弱智的暴力做法。
同样是括号匹配,需要被满足的左括号p两端的答案分别单调
那么找到的右括号应该满足什么样的性质呢?
考虑找到的右括号本来就和左括号匹配,那么应该是可以与之匹配的最靠右的那一个
如何找到,把左括号视为+1,右括号视为-1,那么从头开始跑这个过程,到了p之后的一个位置减为了0
那么这个0就是最后一个可以被拿走的右括号。原因是,再拿右边的,将导致这个0减为-1,也就是增加了一对失配,对数减少了。
考虑右括号没和左括号匹配,这种右括号就是找不到左括号匹配那种,也就是说跑了一遍+1-1之后,它所在的位置应该为负数(虽然强制赋成0)
一个比较优的暴力做法就是,先跑一遍+1-1的括号匹配,把所有的失配右括号塞到堆里,并标记不再进堆
按出牌顺序枚举左括号,首先取出堆顶最优的第二种括号,再暴力找第一种括号,两者取一个max作为此次的手牌
然后删除这两个括号,重新维护+1-1的前缀和序列。就是从修改的地方开始重新跑。
再加一个剪枝,如果跑到一个地方发现你求出来的真实值和它原本的值相同,就不用跑了,因为可以想到再跑也不会再有更新了。
T2
最大值不好搞,把最小值扔到两边。
T3
差分表。
更细节的我也不会,本题用到了一些性质
差分表中的差分值具有单调性,即大的差分值一定出现在序列较靠前的位置
差分表中的k个元素一定作用于序列的前k个元素
于是这些差分值可以用一个堆维护。
另一个学到的地方是dfs+set建树。
CSPS_103的更多相关文章
随机推荐
- Vue学习系列(一)——初识Vue.js核心
前言 vue.js是一套构建用户界面的渐进式框架,vue.js的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件. vue通过DOM事件操作和指令来进行视图层和模型层的相互通讯,会为每一 ...
- eclipse 的使用
eclipse 的官方下载:https://www.eclipse.org/downloads/ 安装时选择 :Eclipse IDE for Java EE Developers 设置: 1. 编 ...
- requests模块(post)请求篇
'''利用parse模块模拟post请求分析百度词典分析步骤:1. 打开F122. 尝试输入单词girl,发现每敲一个字母后都有请求3. 请求地址是 http://fanyi.baidu.com/su ...
- 第10项:重写equals时请遵守通用约定
重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...
- django搭建BBS-登入&验证码的生成
django搭建BBS-登入&验证码的生成 基于注册完成后 文件结构 app 接口 migrations __inint__.py admin.py 管理员页面注册表单用 apps.py bb ...
- java中的静态
static静态 public static void main 类只是用来存储和被调用的,而对象是需要执行的,执行时就必定需要知道程序的入口,这个入口就是由main所在的位置. Java的类中没有m ...
- JavaScript中Array(数组) 对象
JavaScript中Array 对象 JavaScript中创建数组有两种方式 (一)使用直接量表示法: var arr4 = []; //创建一个空数组var arr5 = [20]; // 创建 ...
- Windows下Python虚拟环境的配置
一.了解Python虚拟环境 所谓虚拟环境可以理解为不同的不连通的本地设备,打个比方就是在一台电脑上能做到多台电脑能做的事情. 例如:现在我们有两个项目需要不同的配置,记为A项目需要库a------- ...
- 最优解的lingo和MATLAB解法
最近运筹学学了线性规划和单纯形法,然后老师讲到了运用lingo和MATLAB软件分别求解的方法 首先,我们来讲讲lingo的(小技巧,只要把鼠标滑轮固定在输入界面按ctrl就可以放大了) lingo比 ...
- LeetCode686——Repeated String Match
题目:Given two strings A and B, find the minimum number of times A has to be repeated such that B is a ...