求助,已经被这道题卡了一天了,#10 WA,其它的 AC。
下了 3 个数据点,现在不让下了。
#include<bits/stdc++.h>
#define int long long
#define N 114514
#define inf 0x7fffffff
#define il inline
using namespace std;
inline int read()
{
int n=0,f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9') n=(n<<3)+(n<<1)+(c^48),c=getchar();
return n*f;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10^48);
return;
}
int n;
int ma[200];
struct node
{
char type,id;
int l,r,w;
bool is;
}a[105];
il int init_w()
{
char c;
int res;
scanf("O(%c",&c);
if(c=='1') getchar(),res=0;
else scanf("^%lld)",&res);
return res;
}
il int to_num(int &ind,string s)
{
int res=0,len=s.length();
while(!isdigit(s[ind])&&ind<len)
{
if(s[ind]=='n')
{
ind++;
return inf;
}
ind++;
}
while(isdigit(s[ind])) res=res*10+(s[ind]-'0'),ind++;
return res;
}
il node init_s()
{
node res;
char c;
cin>>c;
if(c=='E') res.type='E';
else
{
string s;
getline(cin,s);
res.type='F',res.id=s[1];
int ind=3;
res.l=to_num(ind,s),res.r=to_num(ind,s);
}
return res;
}
il bool CE()
{
int i;
stack<char>q;
int F=0,E=0;
for(i=1;i<=n;i++)
{
if(a[i].type=='E'&&F==0) return 1;
else if(a[i].type=='F') F++;
else E++;
}
if(F!=E) return 1;
for(i=1;i<=n;i++)
{
if(a[i].type=='F') q.push(a[i].id);
else a[i].id=q.top(),q.pop();
}
for(i=1;i<=n;i++)
{
if(a[i].type=='F')
{
if(ma[(int)a[i].id]==1) return 1;
else ma[(int)a[i].id]=1;
}
else ma[(int)a[i].id]=0;
}
return 0;
}
il int work_w(int x)
{
int le=a[x].l,re=a[x].r;
if(le==inf&&re==inf) return 0;
if(le==inf) return inf;
if(re==inf) return 1;
if(le>re) return inf;
else return 0;
}
il void used_work(int x)
{
int E=0,F=0,i;
for(i=x;i<=n;i++)
{
if(a[i].type=='E') E++;
else F++;
if(E==F) break;
}
int r=i;
for(i=x;i<=r;i++) a[i].is=0;
}
signed main()
{
stack<int>q;
int T=read();
while(T--)
{
memset(a,0,sizeof(a));
while(!q.empty()) q.pop();
int wp,i,j,maxn=0,O=0;
n=read(),wp=init_w();
getchar();
for(i=1;i<=n;i++) a[i]=init_s();
if(CE()) {puts("ERR");continue;}
for(i=1;i<=n;i++) a[i].w=work_w(i),a[i].is=1;
for(i=1;i<=n;i++) if(a[i].type=='F'&&a[i].w==inf&&a[i].is) used_work(i);
for(i=1;i<=n;i++)
{
if(!a[i].is) continue;
if(a[i].type=='F') q.push(a[i].w),O+=a[i].w;
else
{
int ww=q.top();
maxn=max(maxn,O);
O-=ww;
q.pop();
}
}
if(maxn==wp) puts("Yes");
else puts("No");
}
return 0;
}