【NOIP2017提高組 day1】時間複雜度
阿新 • • 發佈:2018-11-08
題目
題解
–是一道噁心的模擬題
首先可以用一個棧存正在執行中的迴圈
用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;
}