• 2014-7-19


    昨天做了两道题,感觉挺水的,就没写题解。但是今天感觉还是纪念一下我的努力吧。

    第一道是POJ 3630 Phone List

    一道基础的Trie树,但是因为采用了动态建树,刚开始就TLE了。最后用了静态储存的方法就过了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn = 100010;
    
    struct N
    {
        int next[11];
        bool sign;
    }node[maxn];
    
    string s;
    int sum;
    
    bool add()
    {
        int len = s.length();
        int root = 0;
        for(int i = 0; i < len; i++)
        {
            int tmp = s[i] - '0';
            if(node[root].next[tmp])
            {
                root = node[root].next[tmp];
                if(i == len - 1)
                return 1;
                if(node[root].sign)
                return 1;
            }
            else
            {
                node[root].next[tmp] = sum;
                root = sum++;
            }
            if(i == len - 1)
            node[root].sign = 1;
        }
        return 0;
    }
    
    int main()
    {
        int t;
        cin >> t;
        while(t--)
        {
            sum = 1;
            bool flag = 1;
            memset(node, 0, sizeof(node));
            int n;
            cin >> n;
            for(int i = 0; i < n; i++)
            {
                cin >> s;
                if(flag)
                if(add())
                flag = 0;
            }
            if(flag)
            cout << "YES" << endl;
            else
            cout << "NO" << endl;
        }
    }
    View Code

    第二道是POJ 3067 Japan

    是一道树状数组的题。也很简单,但是我也是因为犯了很低级的错误导致WA和TLE了几发。
    最后调试的时候发现 树状数组的更新,如果传进去的参数为负数就会死循环,一下恍然大悟,负数加起来最后会是0,之后就死了。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int maxn = 1010;
    
    struct N
    {
        int f, l;
    } node[maxn * maxn];
    
    int sum[maxn];
    int n, m, k;
    vector<int> p;
    
    bool cmp(N a, N b)
    {
        return a.f > b.f;
    }
    
    void insert(int t)
    {
        while(t <= m)
        {
            sum[t] += 1;
            t += t & (-t);
        }
    }
    
    int findsum(int t)
    {
        t--;
        int ret = 0;
        while(t > 0)
        {
            ret += sum[t];
            t -= t & (-t);
        }
        return ret;
    }
    
    void print()
    {
        for(int i = 1; i <= m; i++)
        cout << i << " " << sum[i] << endl;
    }
    
    int main()
    {
        int t;
        cin >> t;
        for(int T = 0; T < t; T++)
        {
            memset(sum, 0, sizeof(sum));
            cin >> n >> m >> k;
            for(int i = 0; i < k; i++)
                scanf("%d%d", &node[i].f, &node[i].l);
            sort(node, node + k, cmp);
    
            int tt = 0;
            while(node[tt].f == node[0].f)
            {
                insert(node[tt].l);
                tt++;
            }
            long long ans = 0;
            for(int i = tt; i < k; i++)
            {
                if(node[i].f == node[i - 1].f)
                {
                    ans += findsum(node[i].l);
                    p.push_back(node[i].l);
                }
                else
                {
                    for(int j = 0; j < p.size(); j++)
                        insert(p[j]);
                    p.clear();
    
                    ans += findsum(node[i].l);
                    p.push_back(node[i].l);
                }
            }
            p.clear();
            printf("Test case %d: %lld
    ", T + 1, ans);
        }
    }
    View Code
  • 相关阅读:
    JS知识点整理
    CSS3疑难问题---6、伪类和伪元素的区别
    人物志---宋霭龄
    范仁义js课程---4、js基本注意点
    legend3---24、软件更新的时候记得保留上两个版本的软件和数据
    心得体悟帖---200215(被动录课效率太低了)
    Java中迭代列表中数据时几种循环写法的效率比较
    Win10
    Java字符串的最大长度
    Android Application对象必须掌握的七点
  • 原文地址:https://www.cnblogs.com/ye8370/p/3856269.html
Copyright © 2020-2023  润新知