1. 程式人生 > >【NOIP2017提高組 day1】時間複雜度

【NOIP2017提高組 day1】時間複雜度

題目

在這裡插入圖片描述
在這裡插入圖片描述


題解

–是一道噁心的模擬題
首先可以用一個棧存正在執行中的迴圈
用isv陣列判斷變數是否重名
要注意不能進入的迴圈雖然不會影響答案,但是要經過標記後也存入站內(為了判錯)
還要注意如果一個O(n)的迴圈如果在一個不能進入的迴圈內,答案是不會增加的


程式碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using
namespace std; const int MAXN=105; int t; int l; string o,a; struct hehe{ int a; int b; int c; }stack[MAXN]; bool isu[MAXN],flag; int top,ans,maxx,sum; int read(int &i){ if(a[i]=='n'){ i+=2; return -1; } int now=0; while(a[i]>='0'&&a[i]<='9'){ now*=10; now+=a[i]-'0'; i++
; } i++; return now; } void add(){ if(top>l/2||isu[a[2]-'a']){ flag=1; return ; } stack[++top].a=a[2]-'a'; stack[top].b=0; stack[top].c=0; isu[stack[top].a]=1; int b=4; int x=read(b),y=read(b); if((x==-1&&y!=-1)||(x!=-1&&y!=-1&&x>y)){ sum++; stack[top]
.b=1; } if(x!=-1&&y==-1&&!sum){ ans++; stack[top].c=1; maxx=max(maxx,ans); } } void out(){ if(!top){ flag=1; return ; } if(!sum&&stack[top].c) ans--; if(stack[top].b) sum--; isu[stack[top--].a]=0; } int read2(){ int i=4; int now=0; while(o[i]>='0'&&o[i]<='9'){ now*=10; now+=o[i]-'0'; i++; } return now; } bool ok(){ if(o.length()==4&&!maxx) return 1; if(o.length()!=4&&read2()==maxx) return 1; return 0; } int main(){ // freopen("complexity.in","r",stdin); // freopen("complexity.out","w",stdout); cin>>t; while(t--){ cin>>l; getchar(); getline(cin,o); top=0; flag=0; ans=0; maxx=0; sum=0; memset(isu,0,sizeof(isu)); for(int i=1;i<=l;i++){ getline(cin,a); if(flag) continue; if(a[0]=='F') add(); else out(); } if(top) flag=1; if(flag){ printf("ERR\n"); continue; } if(ok()) printf("Yes\n"); else printf("No\n"); } return 0; }