大模拟是真的恶心。
题解我能说啥,就是模拟啊!
然后有几个坑点(可能只是对于我的打法吧)
1.注意数字可能为两位数,在处理出数字的时候注意一下(有18分)。
2.一旦某次循环进不去,接下来嵌套的循环就都是废的,打个标记。还要记录一下是哪一次,退出去的时候把标记去掉。(大概是18分)
3.发现ERR后不要直接return,存个标记,因为后面还有读入。(这个有8分)。
然后是丑陋的代码。
#include<bits/stdc++.h> #define N 103 #define INF 2100000000 #define LL long long using namespace std; int read() { int x=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } int T; char s[10]; char op[2],I[2],X[2],Y[2]; int fzd,L; int pre[N];//上次用的是哪个变量 int vis[30];//看这个字母有没有用过 int iss[N];//这重循环是否计入复杂度 void work() { int tot=0; int numF=0,numE=0; int xh=0;int flagg=0; int ans=0;int EEE=0; memset(vis,0,sizeof(vis)); memset(iss,0,sizeof(iss)); memset(pre,0,sizeof(pre)); while(L--) { scanf("%s",op); if(op[0]=='F')numF++; else { ans=max(ans,xh); if(iss[numF])xh--; iss[numF]=0; if(flagg==numF)flagg=0; numF--; if(numF<0){EEE=1;continue;} vis[pre[tot--]]=0; continue; } scanf("%s",I); if(vis[I[0]-'a']){EEE=1;continue;} else { pre[++tot]=I[0]-'a'; vis[I[0]-'a']=1; } scanf("%s",X);scanf("%s",Y); if(X[0]!='n') { if(Y[0]!='n') { int x=X[0]-'0'; if(X[1]!=' ')x=x*10+X[1]-'0'; int y=Y[0]-'0'; if(Y[1]!=' ')y=y*10+Y[1]-'0'; if(x>y)flagg=numF; iss[numF]=0; } else if(!flagg)xh++,iss[numF]=1; } else if(Y[0]!='n')flagg=numF,iss[numF]=0; } if(numF!=0)printf("ERR "); else if(EEE)printf("ERR "); else if(ans!=fzd)printf("No "); else printf("Yes "); // printf("%d ",ans); } int main() { T=read(); while(T--) { L=read(); scanf("%s",s); if(s[2]=='1')fzd=0; else { fzd=s[4]-'0'; if(s[5]!=')') fzd=fzd*10+s[5]-'0'; } work(); } }