• 【题解】NOIP2017时间复杂度


      对大模拟抱有深深的恐惧……不过这次写好像还好?拿个栈维护一下循环的嵌套,然后重定义一下读入即可。记得去年在考场上面死活调不粗来,代码也奇丑无比……希望今年能好一点吧!

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 100000
    int L, mark[maxn];
    char ans[maxn];
    
    int fread(int t)
    {
        int x = 0, k = 1;
        char c; c = ans[t]; t ++;
        while(t < strlen(ans) && (c < '0' || c > '9')) 
        { 
            if(c == '-') k = -1; 
            if(c == 'n') x = 100;
            c = ans[t]; t ++; 
        }
        while(t < strlen(ans) && c >= '0' && c <= '9') 
            x = x * 10 + c - '0', c = ans[t], t ++;
        return x * k;
    }
    
    int read()
    {
        int x = 0, k = 1;
        char c; c = getchar();
        while(c < '0' || c > '9') 
        { 
            if(c == '-') k = -1; 
            if(c == 'n') { x = 1000; return x; }
            c = getchar(); 
        }
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * k;
    }
    
    struct node
    {
        char c; int num;
        node(char _c = 'z' + 1, int _num = 0) 
        { c = _c, num = _num; }
    }S[maxn];
    
    void Work()
    {
        memset(mark, 0, sizeof(mark)); 
        int cal = 0, top = 0, cnt = 0, err = 0, flag = 0;
        for(int i = 1; i <= L; i ++)
        {
            char c; cin >> c;
            if(c == 'F')
            {
                char x; cin >> x;
                if(mark[x - 'a']) flag = 1;
                int l = read(), r = read();
                mark[x - 'a'] = 1;
                if(r - l > 100 && !err) cnt ++, cal = max(cal, cnt);
                if(l > r) err ++;
                S[++ top] = node(x, r - l);
            }
            else
            {
                if(!top) { flag = 1; continue; }
                mark[S[top].c - 'a'] = 0;
                if(!err) cnt -= S[top].num > 100;
                if(S[top].num < 0) err --;
                top --;
            }
        }
        int len = strlen(ans), tag = 0, t = 0;
        for(int i = 0; i < len; i ++) 
            if(ans[i] == 'n') tag = i + 2;
            else if(tag && i == tag) { t = fread(i); break; }
        if(top) flag = 1;
        if(flag) { printf("ERR
    "); return; }
        if(cal != t) flag = 1;
        if(flag) { printf("No
    "); return; }
        printf("Yes
    "); return;
    }
    
    int main()
    {
        int T; scanf("%d", &T);
        while(T --)
        {
            scanf("%d %s", &L, ans);
            Work();
        }
        return 0;
    }
  • 相关阅读:
    22. Generate Parentheses
    21. Merge Two Sorted Lists
    20. Valid Parentheses
    19. Remove Nth Node From End of List
    18. 4Sum
    JDK7新特性
    类Enum
    装饰设计模式
    模板设计模式
    反射
  • 原文地址:https://www.cnblogs.com/twilight-sx/p/9933975.html
Copyright © 2020-2023  润新知