关于这个题,有什么特别卡输入或者其他奇怪的东西啊吗
查看原帖
关于这个题,有什么特别卡输入或者其他奇怪的东西啊吗
230808
Zxsoul楼主2021/6/7 21:16

自己再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;
} 
2021/6/7 21:16
加载中...