当前位置: 首页 > news >正文

P9446 [ICPC 2021 WF] Prehistoric Programs

贪心练手题。
我们发现如果一对括号在一个串内能够匹配那我们直接就匹配完了,不会对其他的产生贡献。
先处理完所有能匹配的,这之后相当于我们把串变成了形如这样子的:

...))(((...

接着对于每个串我们可以得到两个值,一个是左边多出来的右括号的数量记作 \(a_i\),另一个是右边多出来的左括号的数量记作 \(b_i\)
然后根据一个括号匹配的经典技巧,左括号视作 \(1\),右括号视作 \(-1\),那么对于每一个前缀和我们都需要保证其不小于 \(0\)。且最后一个需要等于 \(0\)
那么问题就变形成了选定一个对串的操作顺序,维护一个值 \(k\)。操作每个串时,先减去 \(a_i\) 再加上 \(b_i\),期间每次操作完 \(k\) 均需保证其大于等于 \(0\)。那么如果能满足条件的顺序存在,其中必有一个顺序为尽可能使 \(k\) 每次操作完的最小值都尽可能大的顺序。
于是问题转化成了求 \(k\) 的最小值最大。


考虑一种感性的理解:
首先我们每次都先进行减法操作,那我之前操作完剩下的 \(k\) 值必然越大越优。
这时分两种情况,\(b_i > a_i\)\(a_i > b_i\),显然先选 \(b_i>a_i\) 可以得到更大的 \(k\) 以便后续操作。


接着考虑两个集合内部的顺序:

  1. \(b_i>a_i\) 时,由于先进行减法操作,所以我们应该选择 \(a_i\) 尽量小的元素先操作,这样子可以防止 \(k\) 不够大而减去过多。
  2. \(a_i>b_i\) 时,由于每个串操作完后 \(k\) 一定会变小,所以我们应该选择 \(b_i\) 尽量大的元素先操作,这样子可以让每次操作 \(k\) 尽可能得大来进行下一次减法操作。也可以从倒序的角度将这种情况转化成第一种来推。

这样子我们就可以通过一次排序来确定操作顺序。最后记录一下每次操作是否合法便可输出答案。

代码:

#include<bits/stdc++.h>
#define ll long long
#define e_b emplace_back
#define p_b push_back
#define gc getchar
using namespace std;
#define ios ios::sync_with_stdio(0),cin.tie(0)
const int N=1e6+5;
int rd(){int x=0,f=1;char c=gc();while(c>'9'||c<'0'){if(c=='-')f=-1;c=gc();}while(c<='9'&&c>='0')x=x*10+c-'0',c=gc();return x;
}
int n;
string s[N];
struct pii{int fir,sec,id;
}a[N];
bool cmp(pii x,pii y){if(x.fir>x.sec){if(y.fir>y.sec)return x.sec<y.sec;else return 1;}else{if(y.fir>y.sec)return 0;else return x.fir>y.fir;}
}
signed main(){ios;cin>>n;for(int i=1;i<=n;i++)cin>>s[i];for(int oo=1;oo<=n;oo++){string t=s[oo];int l=0,r=0;for(int i=0;i<t.size();i++){if(t[i]=='(')l++;else{if(l)l--;else r++;}}a[oo]={l,r,oo};}sort(a+1,a+n+1,cmp);int k=0;for(int i=1;i<=n;i++){k-=a[i].sec;if(k<0)cout<<"impossible",exit(0);k+=a[i].fir;}if(!k)for(int i=1;i<=n;i++)cout<<a[i].id<<'\n';else cout<<"impossible";}
http://www.jsqmd.com/news/379469/

相关文章:

  • 别再注册Gmail了!谷歌邮箱这个隐藏功能,让你一个账号当1000个小号用(附保姆级小白教程)
  • 细胞群体动力学仿真软件:CompuCell3D_(6).模拟参数配置与优化
  • Markdown 转 Word 和 PDF:Python 简单实现指南
  • 细胞群体动力学仿真软件:CompuCell3D_(7).细胞间相互作用模型
  • P3381 【模板】最小费用最大流
  • 细胞群体动力学仿真软件:CompuCell3D_(2).细胞建模基础理论
  • P14254 分割(divide)
  • P9358 [ICPC 2022 Xian R] Bridge
  • 2026年可查实盘配资平台推荐:合规透明安全 - 资讯焦点
  • Spring Cloud 熔断降级实战:Sentinel 熔断策略与规则持久化
  • blender导出fbx没有贴图问题
  • 2026年广州家具搬运公司评测推荐榜单:告别搬家烦恼的实用指南 - 品牌推荐
  • 2026年耐介质腐蚀防护布TOP10厂商推荐榜 - 资讯焦点
  • 临沂有实力的橡胶木板材公司推荐 - 品牌推荐(官方)
  • 2026年度成熟GEO服务公司TOP7综合实力榜:AI搜索时代企业增长与选型深度指南 - 资讯焦点
  • 临沂诚信的橡胶木板材生产厂家哪家好 - 品牌推荐(官方)
  • ContextMenuManager 配置右键运行 python 脚本实现一键克隆仓库 - Higurashi
  • 2026年广州家电搬运公司评测推荐榜单:告别搬运烦恼,轻松开启新生活 - 品牌推荐
  • 2026年广州汉米尔顿手表维修评测推荐:非官方维修点选择指南与网点服务深度分析 - 品牌推荐
  • 2026年广州家电搬运公司推荐评测:告别搬运烦恼,专业团队如何选择? - 品牌推荐
  • 手把手部署mysql_exporter:打通MySQL与Prometheus监控链路
  • 2026年广州积家手表维修推荐评测:非官方维修点排行榜与售后网点选择指南 - 品牌推荐
  • 2026年广州积家手表维修网点推荐评测:非官方服务中心选择指南与避坑分析 - 品牌推荐
  • 真实生产案例:一次错误索引设计如何引发 MySQL 写性能雪崩
  • 2026年可查实盘配资平台分析与推荐 - 资讯焦点
  • 2026广东最新结婚五金批发TOP5推荐:优质厂商权威榜单发布,品质服务双优适配,助力婚嫁选购 - 品牌推荐2026
  • JWT 是 token 的一种格式,我的理解对吗?
  • 2026年广州家具搬运公司评测推荐:告别搬家烦恼,如何选择省心靠谱的服务商 - 品牌推荐
  • 2026年广州汉米尔顿手表维修推荐评测:非官方维修点榜单与售后网点服务指南 - 品牌推荐
  • 2026年广州家电搬运公司评测推荐:告别搬运烦恼,专业团队如何选择 - 品牌推荐