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;
}
posted @ 2018-10-25 08:13  PushinL  阅读(166)  评论(0编辑  收藏  举报