CSU 1329: 一行盒子(双向链表)经典 13年省赛题

2024-05-12 20:18

本文主要是介绍CSU 1329: 一行盒子(双向链表)经典 13年省赛题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1329: 一行盒子

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 872   Solved: 176
[ Submit][ Status][ Web Board]

Description

你有一行盒子,从左到右依次编号为1, 2, 3,…, n。你可以执行四种指令:

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。

Input

输入包含不超过10组数据,每组数据第一行为盒子个数n和指令条数m(1<=n,m<=100,000),以下m行每行包含一条指令。

Output

每组数据输出一行,即所有奇数位置的盒子编号之和。位置从左到右编号为1~n。

Sample Input

6 41 1 42 3 53 1 646 31 1 42 3 53 1 6100000 14

Sample Output

Case 1: 12Case 2: 9Case 3: 2500050000

HINT

Source

湖南省第九届大学生计算机程序设计竞赛

解题:数组的下标就是每个所对应的值。

#include<stdio.h>
#include<string.h>
const int N  = 100005 ;
struct NODE
{int l , r ;
}node[N];
int main()
{int n , m , op , x , y ;int T = 0;while(scanf("%d%d",&n,&m)>0){for(int i=0; i<=n; i++)node[i].l=i-1 , node[i].r = i+1 ;int flag = 0 , tmp;while(m--){scanf("%d",&op);if(op==4)flag ^= 1 ;else{scanf("%d%d",&x,&y);if(op==3){ //注意3的交换操作if(node[x].l==y){node[node[x].r].l=y;  node[node[y].l].r=x;node[x].l = node[y].l; node[y].l=x;node[y].r = node[x].r; node[x].r=y;}else if(node[y].l==x){node[node[y].r].l=x;  node[node[x].l].r=y;node[y].l = node[x].l; node[x].l=y;node[x].r = node[y].r; node[y].r=x;}else{node[node[x].l].r= y ; node[node[x].r].l = y;node[node[y].l].r= x ; node[node[y].r].l = x;tmp = node[x].l ; node[x].l=node[y].l; node[y].l=tmp;tmp = node[x].r ; node[x].r=node[y].r; node[y].r=tmp;}continue ;}node[node[x].l].r = node[x].r ; //提出x之前 处理x左值的右指向为x右指向的值node[node[x].r].l = node[x].l ; //同理if(flag)op = 3 - op ;  //如果4操作次数为奇数次,操作要反向操作if(op==2){ //x值放在y值的右边node[x].l = y ; node[x].r = node[y].r;node[node[x].r].l = x ;node[y].r = x;}else{  //x值放在y值的左边node[x].l=node[y].l; node[x].r = y ;node[node[x].l].r = x ;node[y].l = x ;}/*int id = 0 ;for(int i=1; i<=n; i++)printf("%d ",node[id].r) , id = node[id].r;printf("\n");*/}}if(flag&&(n&1))flag = 0 ;int k = 1 , id = node[0].r ;long long ans = 0;while(k<=n){if((k&1))ans += id ;k++ ; id = node[id].r ;}if(flag) ans = (long long )n*(n+1)/2 - ans ;printf("Case %d: %lld\n",++T , ans ) ;}
}


这篇关于CSU 1329: 一行盒子(双向链表)经典 13年省赛题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983633

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图