Description

给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列

Input

第一行一个括号序列,假设其中有m个问号,则之后输入m行,每行两个整数a[i]和b[i]表示把第i个问号换成左括号或右括号的代价(括号序列长度不超过5e4,1<=a[i],b[i]<=1e6)

Output

如果不存在一种合理的替换方案使得该序列变成一个合法的括号序列则输出-1,否则输出最小代价和替换后的合法括号序列

Sample Input

(??) 1 2 2 8

Sample Output

4 ()()

分析

先把问号变成右括号,如果有问题就再把之前的问号变的右括号变成左括号,之前的代价是b[i]现在的代价是a[i],为使总代价最小我们从中选取a[i]-b[i]最小,也就是b[i]-a[i]最大的去重新变,所以用优先队列维护出现过的问号的b[i]-a[i]的值和其位置即可。

代码

#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int maxn = 5e5+;
char s[maxn];
int a[maxn],b[maxn];
priority_queue<pair<int,int> >que;
int main(){
while(~scanf("%s",s)){
int len=strlen(s);
ll ans=;
for(int i=;i<len;i++)
if(s[i]=='?'){
scanf("%d%d",&a[i],&b[i]);
ans+=b[i];
}
int cnt=,g=;
while(!que.empty())que.pop();
for(int i=;i<len;i++){
if(g)break;
if(s[i]=='(')cnt++;
else{
cnt--;
if(s[i]=='?')que.push(pair<int,int>(b[i]-a[i],i)),s[i]=')';
if(cnt<){
if(que.empty())g=;
else{
pair<int,int> temp=que.top();
que.pop();
ans-=temp.first;
cnt+=;
s[temp.second]='(';
}
}
}
}
if(cnt!=)g=;
if(g)printf("-1\n");
else printf("%lld\n%s\n",ans,s);
}
return ;
}

CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】的更多相关文章

  1. CF3D Least Cost Bracket Sequence 贪心

    Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...

  2. codeforces 3D . Least Cost Bracket Sequence 贪心

    题目链接 给一个字符串, 由( ) 以及? 组成, 将?换成( 或者 ) 组成合法的括号序列, 每一个?换成( 或者 ) 的代价都不相同, 问你最小代价是多少, 如果不能满足输出-1. 弄一个变量nu ...

  3. 【Codeforces 3D】Least Cost Bracket Sequence

    Codeforces 3 D 题意:有一个括号序列,其中一些位置是问号,把第\(i\)个问号改成(需要\(a_i\)的代价,把它改成)需要\(b_i\)的代价. 问使得这个括号序列成立所需要的最小代价 ...

  4. Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列

    D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...

  5. Least Cost Bracket Sequence(贪心)

    Least Cost Bracket Sequence(贪心) Describe This is yet another problem on regular bracket sequences. A ...

  6. (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)

    (CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...

  7. CF3D Least Cost Bracket Sequence 题解

    题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...

  8. cf3D Least Cost Bracket Sequence

    This is yet another problem on regular bracket sequences. A bracket sequence is called regular, if b ...

  9. C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

    C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

随机推荐

  1. (Java实现) 洛谷 P1223 排队接水

    题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别 ...

  2. Java实现构造无向图的欧拉回路( The Necklace)

    中文翻译: 但是,唉!一天,项链被撕破了,珠子散落在屋檐上.我姐姐尽力把地板上的珠子都捡起来了.但她不确定自己是否能收集到所有的照片.现在,她来找我帮忙.她想知道是否有可能让克劳斯使用她在里面的所有珠 ...

  3. Java实现二阶魔方旋转

    魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向: ...

  4. 连接mongoodb并且向数据库添加信息

    连接mongoodb 首先安装mongoose 配置URL 连接Mongoodb数据库 控制台输入指令运行该js文件 像这样就连接成功了 向Mongodb数据库增加信息,首先需要写入表格信息 接着解构 ...

  5. CMAKE工具学习

    最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码.于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我 ...

  6. 实验三 Linux系统用户管理及VIM配置

    项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接接地址 学号-姓名 17041428-朱槐健 作业学习目标  1.学习Linux系统用户管理 2.学习vim使用 ...

  7. jQuery实现拖拽元素

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...

  9. const修饰this指针的用法

    #include <iostream> #include <string> using namespace std; class Base { }; class Excepti ...

  10. @codeforces - 674G@ Choosing Ads

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定长度为 n 的序列,m 次询问以及参数 p.共有两类询问: ...