首页 > 其他分享 >【UVA 12657】Boxes in a Line 题解(静态双向链表)

【UVA 12657】Boxes in a Line 题解(静态双向链表)

时间:2023-10-08 13:31:46浏览次数:37  
标签:12657 int 题解 void cmd rev 链表 索引 link

您在编号为1的表格上有n个方框。n从左到右。您的任务是模拟4 命令类型: •1 X Y:将框X向左移动到Y(如果X已经是Y的左侧,则忽略此项) •2 X Y:将框X向右移动到Y(如果X已经是Y的右侧,则忽略此项) •3 X Y:交换盒X和Y •4:反转整条线路。 命令保证有效,即X不等于Y。 例如,如果n=6,在执行1 1 4之后,该行变为2 3 1 4 5 6。然后在执行之后 2 3 5,直线变为2 1 4 5 3 6。然后在执行3 1 6之后,该行变为2 6 4 5 3 1。 然后在执行4之后,行变为1 3 5 4 6 2

输入 最多有10个测试用例。每个测试用例以包含2个整数n,m的行开始 (1≤n,m≤100000)。以下m行中的每一行都包含一个命令。 输出 对于每个测试用例,在奇数索引位置打印数字的和。位置编号为1到n 从左到右。

Sample Input 6 4 1 1 4 2 3 5 3 1 6 4 6 3 1 1 4 2 3 5 3 1 6 100000 1 4 Sample Output Case 1: 12 Case 2: 9 Case 3: 2500050000

思路

实现静态双向链表及插入元素、删除元素、移动元素、交换元素等操作。交换元素a和b时有三种情况,ab相邻且a在b前、ab相邻且a在b后、ab不相邻,要分情况解决。用rev来标记链表是否被翻转,若被翻转输出反向奇数索引之和,反向奇数索引之和等于所有索引之和减去正向奇数索引之和。

AC代码

#include <iostream>
#include <list>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

#define maxn 100005

int n, m;
int rev = 1;
int cmd;
int l[maxn], r[maxn];
int x, y;
int k = 1;

void link(int a, int b)
{
    r[a] = b;
    l[b] = a;
}

void del(int x)
{
    link(l[x], r[x]);
}

void ins(int a, int c, int b)
{
    link(a, c);
    link(c, b);
}

void swp(int x, int y)
{
    if (l[y] == x)
    {
        int a = l[x];
        int b = r[y];
        link(a, y);
        link(y, x);
        link(x, b);
    }
    else if (r[y] == x)
    {
        int a = l[y];
        int b = r[x];
        link(a, x);
        link(x, y);
        link(y, b);
    }
    else
    {
        int a = l[x];
        int b = r[x];
        int c = l[y];
        int d = r[y];
        link(c, x);
        link(x, d);
        link(a, y);
        link(y, b);
    }
}

void print()
{
    cout << "l ";
    for (int i = 1; i <= n; i++)
    {
        cout << l[i] << " ";
    }
    cout << endl
         << "r ";
    for (int i = 1; i <= n; i++)
    {
        cout << r[i] << " ";
    }
    cout << endl;
}

void show()
{
    int t = 0;
    for (int i = 1; i <= n; i++)
    {
        t = r[t];
        cout << t << " ";
    }
    cout << endl;
}

int main()
{
    while (cin >> n >> m)
    {
        rev = 1;
        for (int i = 1; i <= n + 1; i++)
        {
            l[i] = i - 1;
            r[i] = (i + 1) % (n + 1);
        }
        l[0] = n;
        r[0] = 1;
        // show();

        for (int i = 0; i < m; i++)
        {
            cin >> cmd;
            if (4 == cmd)
            {
                rev *= -1;
                continue;
            }
            cin >> x >> y;
            if ((1 == cmd && rev > 0) || (2 == cmd && rev < 0))
            {
                // 将盒子x 移动到y 的左侧
                // cout << "1 " << rev << endl;
                del(x);
                ins(l[y], x, y);
            }
            else if ((2 == cmd && rev > 0) || (1 == cmd && rev < 0))
            {
                // 将盒子x 移动到y 的右侧
                // cout << "2 " << rev << endl;
                del(x);
                ins(y, x, r[y]);
            }
            else if (3 == cmd)
            {
                // 交换盒子x 和y 的位置。
                // cout << x << " swap " << y << endl;
                swp(x, y);
            }
            // show();
        }
        // print();
        // show();
        int t = 0;
        long long sum = 0, j = 0;
        for (int i = 1; i <= n; i++)
        {
            t = r[t];
            sum += t;
            if (i % 2)
            {
                j += t;
            }
        }
        // cout << sum << endl;
        if (!(n % 2) && (rev < 0))
        {
            j = sum - j;
        }
        cout << "Case " << k << ": " << j << endl;
        k++;
    }
    return 0;
}

标签:12657,int,题解,void,cmd,rev,链表,索引,link
From: https://blog.51cto.com/HEX9CF/7755413

相关文章

  • 题解:洛谷P1119 灾后重建
    题解:洛谷P1119灾后重建题目传送门前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来,跑N次floyed,当然由于每次点数时递增的,所以实际复杂度远远小于O(N^4),算了下大概200个点跑了4e8多一......
  • 网络规划设计师真题解析--独立磁盘冗余阵列(二)(容量的计算)
    假如有3块容量是160G的硬盘做RAID5阵列,则这个RADI5的容量是(1);而如果有2块160G的盘和1块80G的盘,此时RAID5的容量是(2)。(1)A.320G    B.160G     C.80G     D.40G(2)A.40G     B.80G     C.160G    D.200G答案:(1)A (2)C解析:常见的RAID......
  • 141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • destoon : 后台无法登录问题解决
    经常有朋友在destoon搬家的时候,数据还原之后,会出现后台无法登录的情况.具体表现为后台帐号密码输入后点击确定,页面刷新.并没有跳转到相应后台页面.但是如果帐号密码输入错误,会提示密码错误的情况.这种情况多半是原系统设置中,设置了cookie作用域的问题,如......
  • 题解 AGC015D【A or...or B Problem】
    题解AGC015D【Aor...orBProblem】problem从\(\geA\)且\(\leB\)的整数中选择一个或多个,把这些整数按位或,求一共有多少种可能的结果。\(1\leA\leB\le2^{60}\)solution首先暴力怎么写呢?FWT。设序列\(a_i=[L\leqi\leqR]\),然后对它FWT-or之后自己乘几倍,再翻回......
  • 掲示板题解
    ffe8c57a-0e48-42bc-88e9-094ce62874ec[传送门](https://www.luogu.com.cn/problem/AT1409)题意分析-----------将第$i$个数提到第一个并输出,也就是倒着扫并输出。倒数第一成为第一,倒数第二成为第二,以此类推,输出该数后标记,最后再枚举一遍,如果没有输出就将它们按正序输出。思路-......
  • 03-链表常见六个操作
    我的想法:问题:正确思路:适用场景:代码//题目:/**学习到:*写代码过程中:*1.类成员变量使用'_',变量名前后都可*2.要弄清出index(第几个元素,从0开始)与_size(链表中元素个数)的意义*2.*代码逻辑:*1.写代码之前,一定要弄清出目的,以及实现他需要的东西,条件*2.操作前......
  • holiday 假期题解(洛谷搬家)
    P5892holiday假期题解前言:如果您想要过这一道题,需要的前置条件:知道什么是决策单调性。知道可持久化线段树怎么找前$k$大。有耐心看很多文字。对于第二点,如果您不会的话,可以参考我的学习笔记(专门为过这道题做的)。链接:https://i.cnblogs.com/posts/edit;postId=1769732......
  • [TJOI2018] 游园会题解
    [TJOI2018]游园会(dp套dp)目录[TJOI2018]游园会(dp套dp)前言:题目简化:解题思路:较为简单的一步:较为困难的步骤思路总结代码呈现:注释/后记:前言:这是和dp套dp的初遇,这不得好好了解一下。题目简化:先把题目进行简化,就是要构造字符串,对于$len\in[0,k]$满足以下条件:只包含......
  • 【洛谷 P1739】表达式括号匹配 题解(栈)
    表达式括号匹配题目描述假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以@作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出YES;否则输出NO。表达式长度小于,左圆括号少于个。输入格式一行:表达式。输出格式一行:YES或NO......