【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 ...
随机推荐
- webpack4 系列教程(十): 图片处理汇总
多图预警!!! 此篇博文共 5 张图(托管在 GitHub),国内用户请移步>>>原文. 或者来我的小站哦 0. 课程源码和资料 本次课程的代码目录(如下图所示): >> ...
- 基于webpack的react脚手架
一.前言:react的cli开发模式太过于简单,好多东西都要自己配置 二.这里有个简单的配置,可以直接上手开发(不熟悉webpack和npm的绕路),已经完成的配置如下 1:默认ejs模板 2:编译l ...
- 手把手教你实现Confluence6.7.1安装与破解
Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki. 一.准备工作 下载confluence6.7.1 wget https://downloads.atlassian ...
- hive的本地安装部署,元数据存储到mysql中
要想使用Hive先要有hadoop集群的支持,使用本地把元数据存储在mysql中. mysql要可以远程连接: 可以设置user表,把localhost改为%,所有可连接.记住删除root其他用户,不 ...
- Python全栈学习_day003作业
day3作业及默写 1,有变量name = "aleX leNb" 完成如下操作: 1) 移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip( ...
- Python 函数介绍
函数的作用 1.减少重复代码 2.方便修改,更易扩展 3.保持代码一致性 函数的命名规则: 1.函数名必须以下划线或字母开头,可以包含任意字母,数字或下划线的组合,不能使用任何的标点符号. 2.函数名 ...
- csharp: read system DSN configured get Driver Names on windows
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- sql script: Graphs, Trees, Hierarchies and Recursive Queries
--------------------------------------------------------------------- -- Inside Microsoft SQL Server ...
- csharp:FTP Client Library using FtpWebRequest or Sockets
https://netftp.codeplex.com/SourceControl/latest http://ftplib.codeplex.com/ https://www.codeproject ...
- js判断当前浏览器语言类型
console.log(window.navigator.language.slice(0, 2)); 得到的是zh