题意:自己看吧
算法:模拟
难度:NOIP+
代码如下:
应该对您没有什么帮助
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cmath>
#include <map>
#include <algorithm>
#define ll long long
using namespace std;
map<int,int>Mbianliang;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Mbianliang.clear();
char OOO[15];
int L;
scanf("%d",&L);
getchar();
getchar();
getchar();
int tim=0;
char q;
q=getchar();
if(q=='n')
{
getchar();
scanf("%s",OOO+1);
int uio=strlen(OOO+1)-1;
if(uio==2)
{
tim+=(OOO[1]-48)*10;
tim+=OOO[2]-48;
}else
{
tim=OOO[1]-48;
}
tim+=123;
}else
{
tim=1;
}
gets(OOO);
/*if(OOO[3]=='1') tim=1;
else if(OOO[3]=='n') tim=OOO[5]-48,tim+=123;*/
char rrr[15];
int fla=0;
char bbll[105];
int ttn=0;
int lj=0,ljj=0;
int maxn=0;
for(int i = 1;i <= L;i++)
{
int ii=i;
scanf("%s",rrr+1);
if(rrr[1]=='F')
{
getchar();
char qw;
scanf("%c",&qw);
bbll[++ttn]=qw;
if(Mbianliang[qw]) fla=1;
else Mbianliang[qw]=1;
char x[5],y[5];
/*getchar();
scanf("%c",&x);
getchar();
scanf("%c",&y);*/
scanf("%s%s",x+1,y+1);
int len=strlen(x+1);
int ln=strlen(y+1);
int aa=0,bb=0;
if(len==1&&ln==1)
{
int nnn=0;
int nnnn=0;
if(x[1]-48>53) nnn=123;
else nnn=x[1]-48;
if(y[1]-48>53) nnnn=123;
else nnnn=y[1]-48;
//if(nnn==nnnn) lj=0;
//if(nnn<20&&nnn<20) lj=0;
if(nnn>nnnn)
{
ljj++;
int tuy=1;
char str[10];
gets(str);
for(int j = i+1;j <= L;j++)
{
if(!tuy)
{
i=j-1;
break;
}
maxn=max(maxn,lj);
scanf("%s",str+1);
if(str[1]=='E') ljj--,Mbianliang[bbll[ttn]]=0,ttn--,tuy--;
if(str[1]=='F') tuy++,ljj++;
if(str[1]=='F')
{
getchar();
scanf("%s",str+1);
bbll[++ttn]=str[1];
if(Mbianliang[str[1]]) fla=1;
else Mbianliang[str[1]]=1;
}
gets(str);
if(!tuy)
{
i=j;
break;
}
}
//break;
}
if(i!=ii) goto loop;
//if(nnn==123&&nnnn==123) lj=0;
if(nnn==123||nnnn==123)
{
if(nnn==123&&nnnn==123) {}
else lj++;
}
}else if(len==1)
{
//if(x[1]-48>53) goto lop;
//else
{
ljj++;
if(ln==3)
{
bb+=(y[1]-48)*100;
bb+=(y[2]-48)*10;
bb+=(y[3]-48)*1;
}else if(ln==2)
{
bb+=(y[1]-48)*10;
bb+=(y[2]-48)*1;
}
aa=x[1]-48;
}
}else if(ln==1)
{
if(y[1]-48>53) lj++;
else
{
ljj++;
if(len==3)
{
aa+=(x[1]-48)*100;
aa+=(x[2]-48)*10;
aa+=(x[3]-48)*1;
}else if(len==2)
{
aa+=(x[1]-48)*10;
aa+=(x[2]-48)*1;
}
bb=y[1]-48;
}
}else
{
ljj++;
if(len==3)
{
aa+=(x[1]-48)*100;
aa+=(x[2]-48)*10;
aa+=(x[3]-48)*1;
}else if(len==2)
{
aa+=(x[1]-48)*10;
aa+=(x[2]-48)*1;
}
if(ln==3)
{
bb+=(y[1]-48)*100;
bb+=(y[2]-48)*10;
bb+=(y[3]-48)*1;
}else if(ln==2)
{
bb+=(y[1]-48)*10;
bb+=(y[2]-48)*1;
}
}
if(aa>bb)
{
//ljj++;
char str[10];
gets(str);
int tuy=1;
for(int j = i+1;j <= L;j++)
{
if(!tuy)
{
i=j-1;
break;
}
maxn=max(maxn,lj);
scanf("%s",str+1);
if(str[1]=='E') ljj--,Mbianliang[bbll[ttn]]=0,ttn--,tuy--;
if(str[1]=='F') tuy++,ljj++;
if(str[1]=='F')
{
getchar();
scanf("%s",str+1);
bbll[++ttn]=str[1];
if(Mbianliang[str[1]]) fla=1;
else Mbianliang[str[1]]=1;
}
gets(str);
if(!tuy)
{
i=j;
break;
}
}
//break;
}
//if(i!=ii) continue;
}
loop: maxn=max(maxn,lj);
if(rrr[1]=='E')
{
Mbianliang[bbll[ttn]]=0;
ljj--;
ttn--;
}
if(ljj<0) lj+=ljj,ljj=0;
if(i==L&&ttn) fla=1;
}
if(ttn!=0) fla=1;
if(fla) puts("ERR");
else if(tim>101)
{
if(tim-123==maxn) puts("Yes");
else puts("No");
}else if(tim==1)
{
puts("Yes");
}
}
return 0 ;
}