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
原文地址:https://www.cnblogs.com/ye8370/p/3856269.html