为什么双倍经验过了但这题过不了?
查看原帖
为什么双倍经验过了但这题过不了?
347664
菲斯斯夫斯基楼主2024/10/8 11:04

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;
}
2024/10/8 11:04
加载中...