P9446 甚至还要构造方案,但是我 AC 了那题,这题过不了。
应该是把 Yes 判成 No 了,求调。
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=1e6+10;
int n,sum,id;
int chk[N];
priority_queue<pii,vector<pii>,greater<pii>>x;
priority_queue<pii>y;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int k=0,mi=1e9;
string s;
cin>>s;
for(int j=0;j<s.size();j++)
{
if(s[j]=='(')k++;
else k--;
mi=min(k,mi);
}
sum+=k;
if(k>=0)x.push({-mi,k});
else y.push({-mi,k});
}
if(sum)return puts("No"),0;
while(!x.empty())
{
if(x.top().fi<=sum)
sum+=x.top().se;
else return puts("No"),0;
x.pop();
}
while(!y.empty())
{
if(y.size()==1)
{
// cout<<sum<<' '<<y.top().se<<endl;
assert(sum+y.top().se==0);
puts(y.top().fi<=sum?"Yes":"No");
return 0;
}
auto l=y.top();
y.pop();
auto r=y.top();
y.pop();
int q=sum+l.se>=r.fi,p=sum+r.se>=l.fi;
if(!q&&!p)return puts("No"),0;
else if(q&&!p)sum+=l.se,y.push(r);
else if(!q&&p)sum+=r.se,y.push(l);
else if(l.se<r.se)sum+=r.se,y.push(l);
else sum+=l.se,y.push(r);
}
puts("Yes");
return 0;
}