【Codeforces 3D】Least Cost Bracket Sequence
Codeforces 3 D
题意:有一个括号序列,其中一些位置是问号,把第\(i\)个问号改成(需要\(a_i\)的代价,把它改成)需要\(b_i\)的代价。
问使得这个括号序列成立所需要的最小代价。
思路1:
这个是正统的贪心。
首先我们假设所有的位置上都是),那么我们在从左向右扫描的途中会发现一些问题。
比如:我们原来的序列是(??),现在假设成了())),那么在第三个字符处就会发现我们的打开的左括号数量为\(-1\),这是肯定不行的,所以我们必须把第二个字符或者第三个字符改成左括号以把左括号数量变成\(1\)。
那么就可以想出一个贪心的方案了:
我们从左向右扫描,如果把当前的问号改成右括号不会使打开的左括号数量出现问题,那么我们就把这个问号待定成右括号;
然后如果出现了问题,我们肯定要把所有的待定问号(包括当前这个)中改动代价最小的改成左括号。
这样我们就可以把左括号数量重新加成正的。
然后我们怎么维护代价最小的待定问号呢?直接用一个优先队列或者一个\(set\)就可以了。
思路2:
这个是过不了的\(dp\)。
我们肯定是考虑到了第\(i\)位,打开的左括号数量是\(j\),最小的代价。记为\(f(i,j)\)。
然后我们考虑转移。如果是左括号,那么转移到\(f(i+1,j+1)\),右括号,转移到\(f(i+1,j-1)\),问号,都要转移,同时加上代价。
可惜,这样会\(mle\)或\(tle\)。
所以考虑优化状态。(转移怎么优化啊。。。
首先我们记如果把从\(i\)开始的所有问号都改成右括号,会把打开的左括号数量减少多少为\(suf_i\)。
那么如果\(j>suf_i\),即所有的一起上都消不掉\(j\),或者\(j\not \equiv suf_i (mod\ 2)\),即把一些右括号改成左括号不可能消掉\(j\),那么这个状态就不要。
可惜这样还是会在第\(31\)个点上挂掉。
思路3:
这个是乱搞的线段树。
ly_61同学提出了用数据结构来优化贪心的方法,然后。。。
首先我们考虑把所有的问号都改成左括号。
然后把所有的问号的左括号改成右括号的代价从小到大排序。
然后按顺序一个个尝试把问号改成右括号,只要不会违背条件——在任何一个位置,这个位置为止打开的左括号数量大于等于\(0\)。
那么我们就可以用线段树来维护对于每一个位置打开的左括号数量。
我们把一个问号改成右括号所改变的是把从那个问号的位置开始一直到最后的所有位置的左括号数量\(-2\)。
改回来的代价是\(+2\)。(废话
然后就可以一个一个尝试辣
如果改到最后发现到最后那个位置的左括号数量不是\(0\),那肯定无解。
这个正确性不是那么显然,但最优性显然。下证正确性。
首先如果把所有的问号都改成左括号时到最后一位的打开的左括号数量不是偶数,则肯定无解。
那么我们需要改的问号的数量也是显然的,不妨记其为\(m\)。
然后就可以发现如果我们每一次修改都可以成功的话至多修改\(m\)个问号。
那么就要证最少修改\(m\)个问号了。
我才不会告诉你我不会证了呢
根据上文,至少有\(m\)个问号使得我们把它们都改成右括号之后可以满足要求
所以我们扫描之后就可以得到\(m\)个???
(其实这个正确性很迷辣。。。
(这个“证明”一点也不像是个证明辣。。。
(反正能过的方法就是好方法。。。
(其实可能有反例的吧。。。
【Codeforces 3D】Least Cost Bracket Sequence的更多相关文章
- 【47.40%】【codeforces 743B】Chloe and the sequence
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 【codeforces 438D】The Child and Sequence
[原题题面]传送门 [大致题意] 给定一个长度为n的非负整数序列a,你需要支持以下操作: 1:给定l,r,输出a[l]+a[l+1]+…+a[r]. 2:给定l,r,x,将a[l],a[l+1],…, ...
- CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】
Description 给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列 Input 第一行一个 ...
- 【贪心】【CF3D】 Least Cost Bracket Sequence
传送门 Description 给一个序列,序列里面会有左括号.问号.右括号.对于一个\(?\)而言,可以将其替换为一个\((\),也可以替换成一个\()\),但是都有相应的代价.问:如何替换使得代价 ...
- 【 CodeForces - 392C】 Yet Another Number Sequence (二项式展开+矩阵加速)
Yet Another Number Sequence Description Everyone knows what the Fibonacci sequence is. This sequence ...
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...
- CF3D Least Cost Bracket Sequence 贪心
Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)
(CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...
随机推荐
- Nginx负载均衡配置调优
worker_processes ; error_log logs/error.log crit; #日志位置和日志级别 pid logs/nginx.pid; worker_rlimit_nofil ...
- BUGList
Django : a. MySQL数据表还未创建时,不可在视图内直接使用模型类对象,产生报错 django.db.utils.ProgrammingError: (1146, "Table ...
- 【代码笔记】Web-ionic-Range
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- js 乘除法小数问题
因为经常需要js来处理显示,就做下笔记 除法: function accDiv(arg1, arg2) { var t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.to ...
- python自动化开发-6
python的常用模块(续) shutil模块:主要是做文件复制的.文件,文件夹,压缩包等的处理模块. 常用的方法: shutil.copyfileobj:将文件的内容拷贝到另一个文件中. 例子: # ...
- 修改Devexpress DateEdit控件默认的日期格式和日历风格
最近项目中很多地方使用到DevExpress的DateEdit控件,而且设置都是一致(日期格式.选择日期的日历的风格等).每一次都需要设置太痛苦,因此需要寻找一种高效的解决方式. 一. 设置好一个作为 ...
- zTree 优秀的jquery树插件
zTree 优秀的jquery树插件,文档详细,渲染快 使用方法: 1.引用zTree的js和css文件 <link href="~/Content/zTree_v3/css/zTre ...
- .net core xss攻击防御
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...
- webservice偶尔报黄页,解决方案
在system.web节点里加以下代码 <webServices> <protocols> <add name="HttpSoa ...
- Linux Cluster
一.Linux集群类型.系统扩展方式及调度方法 1.概念 Linux cluster,Linux集群系统是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作. ...