[NOIP2017 提高組] 時間複雜度
https://gxyzoj.com/d/hzoj/p/3673
按題意模擬即可
時間複雜度的計算方式是:
-
常數->常數 O(1)
-
常數->n O(n)
-
n->n O(1)
就是細節很多,也不會算時間複雜度,掛成了40
程式碼:
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int T,n,tim,st[105],top,ax[105],ay[105];
string t,name[105];
bool use[30];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cin>>t;
tim=0;
if(t!="O(1)")
{
for(int i=4;i<=t.size()-2;i++)
{
tim=tim*10+t[i]-'0';
}
}
int ans=0,cnt=0,fl=0;
for(int i=1;i<=n;i++)
{
ax[i]=ay[i]=0;
string opt;
cin>>opt;
if(opt[0]=='F')
{
string x,y;
cin>>name[i]>>x>>y;
st[++top]=i;
int tmp=name[i][0]-'a';
if(use[tmp])
{
fl=1000;
continue;
}
if(fl) continue;
use[tmp]=1;
int a=0,b=0;
if(x[0]=='n') a=200;
else
{
for(int i=0;i<x.size();i++) a=a*10+x[i]-'0';
}
if(y[0]=='n') b=200;
else
{
for(int i=0;i<y.size();i++) b=b*10+y[i]-'0';
}
if(a>b)
{
fl=i;
continue;
}
if(b>a&&b==200) cnt++;
ans=max(ans,cnt);
ax[i]=a,ay[i]=b;
}
else
{
if(top==0)
{
fl=1000;
continue;
}
int x=st[top];
top--;
int tmp=name[x][0]-'a';
use[tmp]=0;
if(fl==x) fl=0;
if(ax[x]<ay[x]&&ay[x]==200&&!fl) cnt--;
}
// printf("%d %d\n",top,cnt);
}
if(fl==1000) printf("ERR\n");
else if(top) printf("ERR\n");
else if(ans==tim) printf("Yes\n");
else printf("No\n");
for(int i=0;i<=26;i++)
{
use[i]=0;
}
top=0;
}
return 0;
}