Luogu3952 NOIP2017D1T2 时间复杂度
终于A了这傻逼题
23号做了一下午全是ERR 玄学读入 晚上发现复杂度后面有一个换行没吞掉 没过样例 发现没有处理外循环无法进入内循环就不能计算 加了个标记 加了个ans计算最大复杂度交了一发64分
24号弃坑一天
25号早上调了1h 对着一组数据发现循环对总复杂度有影响才能在‘E’时减去复杂度 加了个标记数组82分 再来一组数据 淦 全是n的时候处理错了 改了发下标就A了
就是加了一堆标记 就这样 所有情况都在这里了:
\(F x y (x ≤ y) , O(1)\)
\(F x y (x > y) , O(1)\),且它所包含的循环时间复杂度全部忽略
\(F n x , O(1)\),且它所包含的循环时间复杂度全部忽略
\(F n n , O(1)\)
\(F x n , O(n)\)
CODE:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int T, L;
string O;
string qwq[101];
int main(){
scanf("%d", &T);
while(T--){
int ans=0, num=0, youci=0, cuowu=0, kaishi=0, cengs=0, ncifang=0, x=0, y=0;
bool sy[26]={0};
int bianl[101]={0};
int kq=0;
int jia[101]={0};
scanf("%d", &L);
cin>>O;
for(int i=0; i<O.length(); i++){
if(O[i]=='n') youci=1;
if(O[i]>='0'&&O[i]<='9') num=num*10+O[i]-48;
}
char ch=getchar();
while(ch!='\n')ch=getchar();
for(int i=1; i<=L; i++)
getline(cin, qwq[i]);
for(int i=1; i<=L; i++){
if(qwq[i][0]=='F') kaishi=1;
else if(qwq[i][0]=='E') kaishi=0;
else cuowu=1;
if(kaishi){
cengs++;
if(sy[qwq[i][2]-'a'])cuowu=1;
else sy[qwq[i][2]-'a']=1, bianl[cengs]=qwq[i][2]-'a';
int j=4;
x=0, y=0;
if(qwq[i][j]=='n') x=1000, j=5;
else for(; isdigit(qwq[i][j]); j++) x=x*10+qwq[i][j]-'0';
j++;
if(qwq[i][j]=='n') y=1000;
else for(; isdigit(qwq[i][j]); j++) y=y*10+qwq[i][j]-'0';
if(x==1000&&y==1000) continue;
if(x!=1000&&y==1000&&kq==0) ncifang++, jia[cengs]=1;
if(x!=1000&&y!=1000&&kq==0){
if(x>y) kq=cengs;
continue;
}
if(x==1000&&y!=1000&&kq==0){
kq=cengs;
continue;
}
}
else{
sy[bianl[cengs]]=0;
if(cengs==kq)kq=0;
if(jia[cengs])ncifang--, jia[cengs]=0;
cengs--;
if(cengs<0) cuowu=1;
}
ans=max(ans, ncifang);
if(cuowu) break;
}
if(cengs>0)cuowu=1;
if(cuowu)printf("ERR\n");
else if(youci&&num==ans) printf("Yes\n");
else if(!youci&&!ans) printf("Yes\n");
else printf("No\n");
}
return 0;
}
不如吃茶去