自己再loj上能过90 但是在洛谷过不了,可是下载的样例都是一样的,感觉输入输出也没有问题,求解
/*
先打算打一小时
16:34 开搞
17:00 肾没了
*/
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int A = 1e7+10;
const int B = 1e6+10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int l;
int T;
char in[10];
char last;//记录f是否连续
char q[100];
char p[100];
int pp;
int js;
map<ll,int>mp;
void print2() {printf("ERR\n");}
int st[B];//记录每一层其实位置
int dep[B];
int work[B];//记录这一层支部执行
int main()
{
// freopen("complexity.in","r",stdin);
// freopen("complexity.out","w",stdout);
T=read();
while (T--)
{
int m=0;//记录dep
memset(dep,0,sizeof(dep));
memset(st,0,sizeof(st));
memset(work,0,sizeof(work));
pp=0;
l=read();
mp.clear();
int flag2=0;//统计一共有多少个F
int cnt=0;//用于记录F
int Ans=0;
int ans=0;//用于计数
char opt,a,b[3],c[3];
cin>>in+1;
int bis=in[5]-'0';
if (in[6]!=')') bis=bis*10+in[6]-'0';
while (l--)
{
cin>>opt;
p[++pp]=opt;//将所有的数都推进去
if (opt=='F')
{
cnt++;
cin>>a;
cin>>(b+1);
cin>>(c+1);
q[cnt]=a;//将F进入队列
int bef,aft;//得到真正的数组
if (b[1]=='n') bef=100; else {bef=(b[1]-'0');if (b[2]>='0')bef=bef*10+b[2]-'0';}
if (c[1]=='n') aft=100; else {aft=(c[1]-'0');if (c[2]>='0') aft=aft*10+c[2]-'0';}
if (!mp[a]) mp[a]=1;
else {if (!flag2) print2();flag2=1;}//用了重复的数组
//对答案产生贡献
m++;//新的一层有开始了
st[m]=cnt;
if (work[m-1]==1) work[m]=1;//连续不执行
if (bef>aft) {work[m]=1;continue;}//该层不执行
if (((bef<100 && aft<100) || (bef==aft)) && !work[m]) {ans=max(ans,1);continue;}//都是常数
if (!work[m] && aft==100) ans=ans+100,dep[m-1]=1;//同层已经被更新过啦 ;
}
else if (opt=='E')
{
mp[q[cnt]]=0;//复原
if (cnt==st[m])//该层即将结束
{
dep[m]=0;
st[m]=0;
work[m]=0;
m--;
}
cnt--;//配对
if (cnt<0) {if (!flag2) print2(); flag2=1;}
if (cnt==0)
{
Ans=max(ans,Ans);
ans=0;
}
}
}
if (cnt>0 && !flag2) {print2(); continue;}//有剩余
if (flag2) continue;
int flag=0;
if (Ans==0) Ans=1;
if (Ans==1 && in[3]=='1') {printf("Yes\n");flag=1;}
else
{
int num=0;
while (Ans>=0)
{
if (Ans>=100) num++;
Ans-=100;
}
if (num==bis) {printf("Yes\n"); flag=1;}
}
if (!flag) printf("No\n");
}
return 0;
}