L
题意:构造一个长度为2n的括号序列,满足字典序最小且在给出的q个区间内都至少有一个左括号
思路:
为了满足字典序尽量小,一定想把左括号放在靠左的位置
为了满足区间至少有一个左括号,需要贪心地按左端点从大到小排序,将左括号依次放在区间的左端点。如果区间已经有左括号,直接跳过
-1的情况是左括号数量>n或不能构成合法括号序列
void solve(){int n,q;cin>>n>>q;vector<int>a(2*n+2,-1);vector<pii>line;while(q--){int l,r;cin>>l>>r;line.pb({l,r});}sort(line.begin(),line.end());int now=2*n+1;int cnt=0;for(int i=line.size()-1;i>=0;i--){int l=line[i].fi,r=line[i].se;if(r<now){a[l]=1;cnt++;now=l;}}if(cnt>n){cout<<-1<<endl;return;}for(int i=1;i<=2*n,cnt!=n;i++){if(a[i]!=1){a[i]=1;cnt++;}}int pre=0;rep(i,1,2*n){pre+=a[i];if(pre<0){cout<<-1<<endl;return;}}rep(i,1,2*n){if(a[i]==1){cout<<'(';}else cout<<')';}cout<<endl;
}
