URAL 1992 CVS 链表

不更改链表结构,只是添加节点,没有删除节点。通过记录和更改标记来模拟题意的插入和删除,复制

指针模拟链表:

预开指针,存在M[]中,可以提高效率

 

#include<functional>

#include<algorithm>

#include<iostream>

#include<cstring>

#include<cstdio>

#include<vector>

#include<cmath>

#include<string>

#include<queue>

#include<map>

#include<set>

#include <stack>

#define REP(i, n) for(int i=0; i<n; i++)

#define PB push_back

#define LL long long

#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;



const int maxn = 500005;



struct point{

    int val;

    point *pre;

}M[maxn * 2];

int tot;

struct node{

    point *a, *b;

}c[maxn];



void add(point* &pre, int y)

{

    point *u = &M[tot++];

    u->val = y;

    u->pre = pre;

    pre = u;

}

void del(point* &last)

{

    last = last->pre;

}

int t, m, n;



int main()

{

    char op[12];

    tot = 1;

    n = 1;

    int x, y;

    scanf("%d%d", &t, &m);



    while (t--)

    {

        scanf("%s", op);

        scanf("%d", &x);

        if (op[0] == 'l')

        {

            scanf("%d", &y);



            add(c[x].a, y);

            c[x].b = NULL;

        }

        else if (op[0] == 'r' && op[1] == 'o')

        {

            if (c[x].a)

            {

                add(c[x].b, c[x].a->val);

                del(c[x].a);

            }

        }

        else if (op[0] == 'r' && op[1] == 'e')

        {

            if (c[x].b)

            {

                add(c[x].a, c[x].b->val);

                del(c[x].b);

            }

        }

        else if (op[0] == 'c' && op[1] == 'l')

        {

            c[++n] = c[x];

        }

        else

        {

            if (!c[x].a) printf("basic\n");

            else printf("%d\n", c[x].a->val);

        }

    }

}

数组模拟链表:

 

 

#include<functional>

#include<algorithm>

#include<iostream>

#include<cstring>

#include<cstdio>

#include<vector>

#include<cmath>

#include<string>

#include<queue>

#include<map>

#include<set>

#include <stack>

#define REP(i, n) for(int i=0; i<n; i++)

#define PB push_back

#define LL long long

#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;



const int maxn = 500005;



struct point{

    int val;

    int pre;

}P[maxn * 2];



struct node{

    int a, b;

    node(){}

    node(int a, int b) : a(a), b(b){}

}c[maxn];

int tot;



int t, m, n;



void add(int u, int &pre, int y)

{

    P[tot].pre = pre;

    P[tot].val = y;

    pre = tot++;

}



void del(int &last)

{

    last = P[last].pre;

}



int main()

{

    char op[12];

    n = 1;

    tot = 1;

    int x, y;

    scanf("%d%d", &t, &m);



    while (t--)

    {

        scanf("%s", op);

        scanf("%d", &x);

        if (op[0] == 'l')

        {

            scanf("%d", &y);



            add(x, c[x].a, y);

            c[x].b = 0;

        }

        else if (op[0] == 'r' && op[1] == 'o')

        {

            if (c[x].a)

            {

                add(x, c[x].b, P[c[x].a].val);

                del(c[x].a);

            }

        }

        else if (op[0] == 'r' && op[1] == 'e')

        {

            if (c[x].b)

            {

                add(x, c[x].a, P[c[x].b].val);

                del(c[x].b);

            }

        }

        else if (op[0] == 'c' && op[1] == 'l')

        {

            c[++n] = node(c[x].a, c[x].b);

        }

        else

        {

            if (!c[x].a) printf("basic\n");

            else printf("%d\n", P[c[x].a].val);

        }

    }

}



 

 

你可能感兴趣的:(cvs)