洛谷P3952 时间复杂度
作者:互联网
明显一道模拟题,没有特别的算法,就是考验耐心。
输入:
//将数字记为k
分成三种:
k O(n^k)
F i x y
E
第二种由于不会出现以变量作为x,y的值,如:
F i 1 n
F j i+1 n
则没有必要保存各个变量的值。
对于时间复杂度:
F i k k = F i n k = O(1)
只有 F i k n = O(n)
则也没有必要保存k的值,只须关注x,y是否等于n和循环成立即可。
剩下的就是简单的模拟。
代码:
#include<iostream> #include<stack> #include<cstring> using namespace std; stack<bool> q; char st[105]; bool fnd(char a); void mfnd(); int main() { string inERR,ai,aj; int ans,t,i,j,k,kline,now,nans,fans,zERR,reERR; char a; bool ERR; cin>>t; for(int o=1;o<=t;o++) { memset(st,0,sizeof(st)); ERR=0; now=0; nans=0; fans=0; zERR=0; reERR=0; cin>>kline>>a>>a>>a; if(a=='1')//ans=0 O(1) ans=k O(n^k) { ans=0; cin>>a; } else cin>>a>>ans>>a; for(int u=1;u<=kline;u++) { cin>>a; if(ERR==1&&a=='F') cin>>inERR>>inERR>>inERR; else if(ERR==1) continue; else { if(a=='F') { cin>>a; if(fnd(a)) { ERR=1; reERR=1; cin>>inERR>>inERR; continue; } cin>>ai>>aj; now++; if(aj=="n"&&ai!="n") { q.push(1); nans++; } else q.push(0); if((ai>aj&&ai.size()>=aj.size())||(ai=="n"&&aj!="n"))//判断循环是否能执行 zERR++; if((nans>fans)&&(zERR==0)) fans=nans; } else if(a=='E') { mfnd(); if(zERR!=0) zERR--; now--; if(now<0) { ERR=1; cout<<"ERR"<<endl; continue; } if(q.top()==1) nans--; q.pop(); if(now==0) { memset(st,0,sizeof(st)); zERR=0; } } } } if(reERR) cout<<"ERR"<<endl; else if(now!=0&&ERR!=1) cout<<"ERR"<<endl; else if(fans==ans&&ERR!=1) cout<<"Yes"<<endl; else if(fans!=ans&&ERR!=1) cout<<"No"<<endl; } system("pause"); return 0; } bool fnd(char a) { int i; i=0; while(st[i]!=0) { if(st[i]==a) return 1; i++; } i=0; while(st[i]!=0) i++; st[i]=a; return 0; } void mfnd() { int i; i=0; while(st[i]!=0) i++; if(i==0) return ; st[i-1]=0; return ; }
其实洛谷的数据还挺水的,没有出现在循环中弹出的操作,都是所有循环结束后一次性弹出。
标签:inERR,洛谷,ai,复杂度,aj,cin,&&,ans,P3952 来源: https://www.cnblogs.com/nenT/p/11370145.html