• 【NOIP2017 DAY1T2】 时间复杂度


    【题目链接】

               点击打开链接

    【算法】

            其实这就是一道模拟题啦!

            在判error和计算时间复杂度时,我们需要用栈这种数据结构

    【代码】

              这题的代码还是有些难写的,写的时候一定要有条理!

               

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXL 100
    const int INF = 2e9;
    
    int T,n;
    char opt[MAXL+10],value[MAXL+10];
    int l[MAXL+10],r[MAXL+10];
    
    template <typename T> inline void read(T &x) {
        int f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
        for (; isdigit(c); c = getchar())  x = (x << 3) + (x << 1) + c - '0';
        x *= f;    
    }
    template <typename T> inline void write(T x) {
        if (x < 0) { putchar('-'); x = -x; }
        if (x > 9) write(x/10);
        putchar(x%10+'0');    
    }
    template <typename T> inline void writeln(T x) {
        write(x);
        puts("");    
    }
    
    inline int get() {
        int ret = 0;
        bool b = true;
        getchar();
        char c = getchar();
        while (c != ')') {
            if (c == '^') b = false;
            if (isdigit(c)) ret = (ret << 3) + (ret << 1) + c - '0';
            c = getchar();
        } 
        getchar();
        if (b) return 0;
            else return ret;    
    }
    
    inline void getstr(int pos) {
            char c = getchar();
            while (c != 'F' && c != 'E') c = getchar();
            opt[pos] = c;
    }
    
    inline void getinfo(int pos) {
        int i,len;
        char tx[10],ty[10];
        getstr(pos);
        if (opt[pos] == 'E') return;
        scanf(" %c %s %s",&value[pos],tx+1,ty+1);
        if (tx[1] != 'n') {
            len = strlen(tx+1);
            for (i = 1; i <= len; i++) l[pos] = (l[pos] << 3) + (l[pos] << 1) + tx[i] - '0';
        } else
                l[pos] = INF;
        if (ty[1] != 'n') {
                len = strlen(ty+1);
                for (i = 1; i <= len; i++) r[pos] = (r[pos] << 3) + (r[pos] << 1) + ty[i] - '0';
          } else
                  r[pos] = INF;
          getchar();
    }
    
    inline bool error() {
        int i,top=0;
        static int stk[MAXL+10];
        static bool used[26];
        memset(used,0,sizeof(used));
        for (i = 1; i <= n; i++) {
            if (opt[i] == 'F') {
                if (used[value[i]-'a']) return true;
                used[value[i]-'a'] = true;
                stk[++top] = i;
            } else {
                if (!top) return true;
                used[value[stk[top]]-'a'] = false;
                  --top;
            }
        }    
        return top != 0;
    }
    
    inline void solve() {
        int i,top=0,c,tmp,ans=0;
        static int stk[MAXL+10];
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        read(n);
        c = get();    
        for (i = 1; i <= n; i++) getinfo(i);
        if (error()) {
            puts("ERR");
            return;
        } 
        for (i = 1; i <= n; i++) {
            if (opt[i] == 'F') {
                    tmp = stk[top];
                    if (l[i] > r[i]) tmp = -1;
                    else if (r[i] - l[i] > 1000 && stk[top] != -1) ++tmp;
                    stk[++top] = tmp;
                    ans = max(ans,tmp);
                    } else 
                            --top;
        }
        if (ans == c) puts("Yes");
        else puts("No");
    }
    
    int main() {
        
        read(T);
        while (T--) solve();
        
        return 0;
    }
  • 相关阅读:
    Java Web工作原理
    Java——入门“HelloWorld”
    Java——介绍
    vscode给 vue 项目 添加 eslint 验证提示遇到的细节问题
    使用全局变量,当多个线程同时修改静态属性第一季
    自编验证码图片识别程序 自定义的FloodFill函数
    nginx卸载ssl django明文
    nginx 7层全转发
    JAVA Socket入门详解(基本用法与代码实现)
    小白进入公司究竟有哪些不同?学生一定要看!
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196401.html
Copyright © 2020-2023  润新知