HDU-2017 ACM/ICPC Asia Regional Qingdao Online-1010-Brute Force Sorting

来源:互联网 发布:年月日时干支推算法 编辑:程序博客网 时间:2024/06/14 12:10

ACM模版

描述

描述

题解

这个题真心不难,典型的链表题,在 51Nod 上见过好多次同类型的题,可是我竟然无限 TLE……至今未找到 bug,在网上找了一份 AC 代码,发现他的方法比我的还要多很多操作,感觉比我的还慢啊,可是人家竟然 AC 了……很诧异啊……算了,两个代码都贴一下吧,希望大佬们可以看出我的 TLE 的尿点……

代码

One:

//  TLE#include <iostream>#include <cstdio>using namespace std;const int MAXN = 1e5 + 10;int N;int A[MAXN];int pre[MAXN];int net[MAXN];int tmp[MAXN];template <class T>inline void scan_d(T &ret){    char c;    ret = 0;    while ((c = getchar()) < '0' || c > '9');    while (c >= '0' && c <= '9')    {        ret = ret * 10 + (c - '0'), c = getchar();    }}template <class T>inline void print_d(T x){    if (x > 9)    {        print_d(x / 10);    }    putchar(x % 10 + '0');}void init(int cnt){    //  构造链表结构    for (int i = 1; i <= cnt; ++i)    {        pre[i] = i - 1;        net[i] = i + 1;    }    net[cnt] = A[0] = 0;}void _erase(int x){    int l = pre[x], r = net[x];    if (l)    {        net[l] = r;    }    if (r)    {        pre[r] = l;    }}int main(int argc, const char * argv[]){    int T;    scan_d(T);    while (T--)    {        scan_d(N);        init(N);        if (N == 0)        {            print_d(0);            putchar(10);            putchar(10);            continue;        }        for (int i = 1; i <= N; i++)        {            scan_d(A[i]);        }        int x = 1, y = N;        while (1)        {            int tot = 0, t = x;            while (t)            {                if (t != x && A[t] < A[pre[t]])                {                    tmp[tot++] = t;                }                if (t != y && A[t] > A[net[t]])                {                    if (tmp[tot - 1] != t)                    {                        tmp[tot++] = t;                    }                }                t = net[t];            }            for (int i = 0; i < tot; i++)            {                if (tmp[i] == x)                {                    x = net[tmp[i]];                    pre[x] = 0;                }                if (tmp[i] == y)                {                    y = pre[tmp[i]];                    net[y] = 0;                }                _erase(tmp[i]);            }            if (!tot)            {                break;            }        }        int cnt = 0;        for (int i = x; i; i = net[i])        {            cnt++;        }        print_d(cnt);        putchar(10);        if (cnt == 0)        {            putchar(10);        }        else        {            print_d(A[x]);            for (int i = net[x]; i; i = net[i])            {                putchar(' ');                print_d(A[i]);            }            putchar(10);        }    }    return 0;}

Two:

#include <iostream>#include <cstring>#include <vector>#include <set>#define PB push_backusing namespace std;const int MAXN = 1e6 + 7;int n, now, pre;int A[MAXN];int pe[MAXN];int nt[MAXN];int bz[MAXN];set<int> si;vector<int> vi;int main(void){    int T;    cin >> T;    while (T--)    {        memset(bz, 0, sizeof(bz));        scanf("%d", &n);        for (int i = 1; i <= n; i++)        {            scanf("%d", A + i);            bz[i] = 0;            pe[i] = i - 1;            nt[i] = i + 1;            si.insert(i);        }        nt[0] = 1, pe[n + 1] = n, pe[1] = 0, nt[n] = n + 1;        A[0] = 0, A[n + 1] = MAXN;        while (si.size())        {            vi.clear();            for (auto &x : si)            {                int ntx = nt[x], pex = pe[x];                if (A[pex] > A[x])                {                    vi.PB(pex);                    vi.PB(x);                }                if (A[x] > A[ntx])                {                    vi.PB(x);                    vi.PB(ntx);                }            }            si.clear();            for (auto &x : vi)            {                if (!bz[x])                {                    int ntx = nt[x], pex = pe[x];                    nt[pex] = ntx, pe[ntx] = pex;                    si.insert(pex);                    bz[x] = 1;                }            }        }        int cnt = 0;        for (int i = nt[0]; i != n + 1; i = nt[i])        {            cnt++;        }        printf("%d\n", cnt);        for (int i = nt[0]; i != n + 1; i = nt[i])        {            printf("%d ", A[i]);        }        printf("\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击