时间复杂度(模拟)

满分做法:

不难发现,可以用树形结构递归求解,在此说一些易错点。

1.要用双端队列储存第几个循环。

2.读到E时就队尾,如果已经空了,就是ERR。注意每次要把循环下标清零。

3.当x,y都是n,他是o1的,可以往下搜索。

#include<map>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<deque>
using namespace std;
int t;
int l;
char fzd[10];
int num;
bool flag;
char b[210];
map<char,bool> mp;
deque<int> q; 
int tot,pre[210],last[210],other[210],w[210];
void add(int x,int y)
{
 tot++;
 pre[tot]=last[x];
 last[x]=tot;
 other[tot]=y; 
}
int dfs(int x)
{
 int tmp=w[x],sum=0;
 for(int p=last[x];p;p=pre[p])
 {
  int v=other[p];
  if(w[v]==-1) continue;
  sum=max(sum,dfs(v));
 }
 return tmp+sum;
}
int main()
{
 scanf("%d",&t);
 while(t--)
 {
   tot=0;
   q.clear();
   memset(last,0,sizeof(last));
   memset(w,0,sizeof(w));
   flag=0;
   num=0;
   mp.clear();
   scanf("%d",&l);
   scanf(" O(%s)",fzd+1);
   int len=strlen(fzd+1);
   if(len==1) num=0;
   else
   {
   	 for(int i=3;i<=len-1;i++)
   	 num*=10,num+=fzd[i]-'0';
   }
   for(int i=1;i<=l;i++)
   {
   	 char s;
	 cin>>s;
	 if(s=='F')
	 {
	   cin>>b[i];
	   if(mp[b[i]])
	   flag=1;
	   mp[b[i]]=1;
	   char kai[5],ed[5];
	   scanf("%s",kai+1);
	   scanf("%s",ed+1);
	   int l1=strlen(kai+1);
	   int l2=strlen(ed+1);
	   int num1=0,num2=0;
	   for(int j=1;j<=l1;j++)
	   {
	   	 if(kai[j]=='n')
	   	 {
	   	    w[i]=-1;
		    continue;	
	   	 }
	   	 num1*=10;
	   	 num1+=kai[j]-'0';
	   }
	   for(int j=1;j<=l2;j++)
	   {
	   	  if(ed[j]=='n')
	   	  {
	   	     if(kai[1]!='n')
			 w[i]=1;
	   	  }
	   	  num2*=10;
	   	  num2+=ed[j]-'0';
	   }
	   if(w[i]==0)
	   {
	   	 if(num1<=num2)
	   	 w[i]=0;
	   	 else w[i]=-1;
	   }
	   if(kai[1]=='n'&&ed[1]=='n')
	   w[i]=0;
	   if(q.size()) add(q.back(),i);
	   if(q.empty()) add(0,i);
	   q.push_back(i);
     }
     else
     {
      if(q.empty())
	  {
	   flag=1;
	   continue;
      }
      mp[b[q.back()]]=0;
      q.pop_back();
     }
   }
   if(flag||q.size())
   {
   	 printf("ERR\n");
   	 continue;
   }
   int ans=dfs(0);
   if(ans==num)
   printf("Yes\n");
   else 
   printf("No\n");
 }
 return 0;	
}
posted @ 2019-11-06 19:45  lihan123  阅读(175)  评论(0编辑  收藏  举报