D. Little Artem and Dance(带环模拟 + 规律)
D. Little Artem and Dance
Little Artem is fond of dancing. Most of all dances Artem likes rueda
— Cuban dance that is danced by pairs of boys and girls forming a
circle and dancing together.More detailed, there are n pairs of boys and girls standing in a
circle. Initially, boy number 1 dances with a girl number 1, boy
number 2dances with a girl number 2 and so on. Girls are numbered in
the clockwise order. During the dance different moves are announced
and all pairs perform this moves. While performing moves boys move
along the circle, while girls always stay at their initial position.
For the purpose of this problem we consider two different types of
moves:Value x and some direction are announced, and all boys move x
positions in the corresponding direction. Boys dancing with
even-indexed girls swap positions with boys who are dancing with
odd-indexed girls. That is the one who was dancing with the girl 1
swaps with the one who was dancing with the girl number 2, while the
one who was dancing with girl number3 swaps with the one who was
dancing with the girl number 4 and so one. It’s guaranteed that n is
even. Your task is to determine the final position of each boy.Input The first line of the input contains two integers n and q
(2 ≤ n ≤ 1 000 000, 1 ≤ q ≤ 2 000 000) — the number of couples in the
rueda and the number of commands to perform, respectively. It’s
guaranteed that n is even.Next q lines contain the descriptions of the commands. Each command
has type as the integer 1 or 2 first. Command of the first type is
given as x ( - n ≤ x ≤ n), where 0 ≤ x ≤ n means all boys moves x
girls in clockwise direction, while - x means all boys move x
positions in counter-clockwise direction. There is no other input for
commands of the second type.Output Output n integers, the i-th of them should be equal to the
index of boy the i-th girl is dancing with after performing all q
moves.
Examples
input
6 3
1 2
2
1 2
output
4 3 6 5 2 1
input
2 3
1 1
2
1 -2
output
1 2
input
4 2
2
1 3
output
1 4 3 2
思路如下
- 题意:经过题目上的两种操作后,输出 从 第一个 女孩 到 最后一个 女孩 所对应的 男孩的编号。
- 思路: 这一题我开始想的是 直接用 “环形双向链表”(应该是叫这个名字吧)进行模拟,但是由于链表访问中间某个位置的元素浪费时间太长了,造成时间超时了。。。。。 然后又决定 将一开始的模拟思路用 数组来实现模拟 环形双向链表 功能,这样可以快速的 解决 对中间元素的开素访问,但是遗憾的是还是 超时。。。。。
然后就决定 去看看题解怎么写的,在别人的题解中得到了 方法:
规律如下:
- 在奇数位置排列的相对位置是不会变的:XX 1 XX 3 XX 5 XX 7XX;
在偶数位置排列的相对位置也是不变的:XX 2 XX 4 XX 6 XX 8 XX. - 所有的 奇数位置 总是 在所有的偶数位置 前边 或 后边,而且 相邻的奇数与偶数之间的位置 总是相邻的(如果把位置形成一个环)
原因:经过操作 1 之后显然 奇数之间的相对的位置是不会改变的,偶数也同理,而且 相邻的奇数与偶数之间的位置 总是相邻的(如果把位置形成一个环)
经过操作 2 之后,所有相邻的奇、偶数位置进行交换,因此也不会破坏 规律1 :奇数之间、偶数之间的相对位置不改变 ;但是会 改变奇偶数位置之间的 相对位置(例如:之前所有相邻的的 偶数位置在 奇数位置的前边:2 、1、4、3、6 、5,现在则变成相反的情况:1、2、3、4、5、6 )。 - 在有了这些规律之后,我们在模拟的时候只需要模拟 奇数位置的第一个 b = 1 和 偶数位置的第一个数 a = 0 的变化情况,则最终得到的 a 、b 位置的值 为 1、2 其它的 位置 则只需要根据 规律1 :奇数之间、偶数之间的相对位置是不变的 、规律2: 相邻两个奇偶数位置之间总是 相邻的。就能把 数组中剩余位置的值 填补出来!
虽然前两个题解都超时了,但是还是可以从里面学到很多的知识的,尤其是练习了 对 链表 的使用
超时题解一
#include<iostream>
#include<cstdlib>
using namespace std;
struct Node
{
char girl_data;
int data;
Node * last;
Node * next;
} * head;
int main()
{
//freopen("test.txt","r",stdin);
head = (Node *)malloc(sizeof(Node));
head -> data = 1;
int n,q;
scanf("%d %d",&n,&q);
Node * normal;
Node * last_pos = head;
for(int i = 2; i <= n; i ++)
{
normal = (Node *)malloc(sizeof(Node));
normal -> data = i;
normal -> last = last_pos;
last_pos -> next = normal;
last_pos = normal;
}
head -> last = last_pos;
last_pos -> next = head;
while(q --)
{
int type;
scanf("%d", &type);
if(type == 1)
{
int step;
scanf("%d", &step);
if(step > 0)
{
Node * st_pos = head;
for(int i = 0; i < step; i ++)
{
st_pos = st_pos -> last;
}
head = st_pos;
}
else
{
Node * st_pos = head;
for(int i = 0; i < -step; i ++)
{
st_pos = st_pos -> next;
}
head = st_pos;
}
}
else
{
Node * pos = head;
for(int i = 1; i <= n; i ++)
{
pos = pos -> next;
if(i % 2 != 0)
{
int tem = pos -> data;
pos -> data = pos -> last -> data;
pos -> last -> data = tem;
}
}
}
}
Node * pos = head;
for(int i = 1; i <= n; i ++)
{
printf("%d ",pos ->data);
pos = pos -> next;
}
return 0;
}
超时题解二
#include<iostream>
using namespace std;
const int Len = 1000005;
int node[Len];
int main()
{
//freopen("T.txt","r",stdin);
int n,q;
scanf("%d %d",&n,&q);
int head = 0;
for(int i = 0; i < n; i ++)
node[i] = i + 1;
while(q --)
{
int type;
scanf("%d", &type);
if(type == 1)
{
int step;
scanf("%d",&step);
if(step >= 0)
{
head -= step;
if(head < 0)
head += n;
}
else
{
head -= step;
head %= n;
}
}
else
{
int st_pos = head;
for(int i = 1; i <= n/2; i ++)
{
int tem = node[st_pos];
node[st_pos] = node[(st_pos + 1) % n];
node[(st_pos + 1) % n] = tem;
st_pos += 2;
st_pos %= n;
}
}
}
for(int i = 1; i <= n; i ++)
{
printf("%d ",node[head]);
head ++;
head %= n;
}
return 0;
}
正解
#include<iostream>
using namespace std;
const int Len = 1000005;
int node[Len];
int main()
{
// freopen("test.txt","r",stdin);
int a = 0,b = 1; //只对 “奇、偶前开头前两个位置” 进行模拟操作(⚠️ 注意:这里的 下标是从 0 位置开始的)
int n,q;
scanf("%d %d",&n,&q);
int type,step;
while(q --)
{
scanf("%d",&type);
if(type == 1)
{
scanf("%d",&step);
a += step; //根据 step 的正、负 进行 模拟顺时针、逆时针 移动
(a+=n) %= n; //处理以防止越界
b += step;
(b+=n) %= n;
}
else //相邻奇偶位置进行位置交换(奇数位置 变成 偶数位置 ;偶数位置 变成 奇数位置)
{
if(a % 2 == 0) //如果是 偶数 位置 +1 变成 奇数位置
{
a ++;
a %= n; //防止 越界
}
else //如果是 奇数 - 1 变 偶数位置
{
a --;
if(a < 0)
a += n;
}
if(b % 2 == 0) //同理
{
b ++;
b %= n;
}
else
{
b --;
if(b < 0)
b += n;
}
}
}
int zhi = 1;
//往数组里填充数字 (注意为什么这样填数是可行的? 因为 位置 a、b要么是相邻的的 要么是 一个在开头位置,一个在结尾位置,这样在通过取余数 就可以保证 填上连续的数字了)
for(int i = 0;i < n; i += 2)
{
node[(a + i) % n] = zhi;
node[(b + i) % n] = zhi + 1;
zhi += 2;
}
for(int i = 0; i < n; i ++)
printf("%d ",node[i]);
return 0;
}
D. Little Artem and Dance(带环模拟 + 规律)的更多相关文章
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance 模拟
D. Little Artem and Dance 题目连接: http://www.codeforces.com/contest/669/problem/D Description Little A ...
- lintcode:带环链表
带环链表 给定一个链表,判断它是否有环. 解题 定义两个指针p1 p2 p1每次向前走一步 p2每次向前走两步 当p2能赶上p1的时候说明有环 /** * Definition for ListNod ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- [LintCode] Linked List Cycle(带环链表)
描述 给定一个链表,判断它是否有环. 样例 给出 -21->10->4->5, tail connects to node index 1,返回 true. 这里解释下,题目的意思, ...
- HDU 4443 带环树形dp
思路:如果只有一棵树这个问题很好解决,dp一次,然后再dfs一次往下压求答案就好啦,带环的话,考虑到环上的点不是 很多,可以暴力处理出环上的信息,然后最后一次dfs往下压求答案就好啦.细节比较多. # ...
- CodeForces 668B Little Artem and Dance
B. Little Artem and Dance time limit per test 2 second memory limit per test 256 megabytes input sta ...
- D. Little Artem and Dance
题目链接:http://codeforces.com/problemset/problem/669/D D. Little Artem and Dance time limit per test 2 ...
- codeforces 669D D. Little Artem and Dance(乱搞题)
题目链接: D. Little Artem and Dance time limit per test 2 seconds memory limit per test 256 megabytes in ...
- Codeforces 669D Little Artem and Dance (胡搞 + 脑洞)
题目链接: Codeforces 669D Little Artem and Dance 题目描述: 给一个从1到n的连续序列,有两种操作: 1:序列整体向后移动x个位置, 2:序列中相邻的奇偶位置互 ...
随机推荐
- Redis(十一):哨兵模式架构设计分析
业务最初的应用场景中,我们也许使用单机redis就可以应付业务要求,但并非一直可行. 比如单机的读写能力问题,单机的可用性问题,单机的数据安全性问题.这些都是许多互联网应用经常会遇到的问题,也基本上都 ...
- 【原创】(四)Linux进程调度-组调度及带宽控制
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- for循环结合range使用方法
range概念:表示一个数据范围 基本的语法格式:range(开始数据,结束数据(不包括结束数据),步长) 记住一个公式:下一个数据=开始数据+步长 步长:表示的是数据前后的间隔 OK,基本的概念和语 ...
- openwrt 上的 upnp wifi 音频推送 gmediarender
首先是必须启用的模块 Libraries ---> <*> libupnp Sound ---> <*> alsa-utils<*> madplay-a ...
- MySQL记录操作(增删改)
概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据 ...
- 某些时候 v-if 会导致 v-modal 内部数据获取不到 也watch不到,这个时候用v-show即可,另外提一下数组要整体赋值才有双向绑定
某些时候 v-if 会导致 v-modal 内部数据获取不到 也watch不到,这个时候用v-show即可,另外提一下数组要整体赋值才有双向绑定
- Lambda表达式学习笔记
Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...
- 【JAVA进阶架构师指南】之三:深入了解类加载机制
前言 在上一篇文章中,我们知道了JVM的内存划分,其中在说到方法区的时候说到方法区中存放的信息包括[已被JVM加载的类信息,常量,静态变量,即时编译的代码等],整个方法区其实就和类加载有关. 类加 ...
- ERP系统功能及部署方式
ERP是对企业经营过程中的一些事项进行系统化管理的一种软件,所以ERP软件包含企业经营过程中需要用到的多种功能管理模块,并且ERP软件有两种部署方式.下面一起来了解一下相关的知识吧! ERP系统的功能 ...
- 图解I/O模型
本文带你鸟瞰I/O模型全貌,希望可以让你对I/O模型有一个直观的认识 什么是I/O?I/O的过程?同步阻塞 I/O同步非阻塞 I/OI/O多路复用异步I/O 什么是I/O? I/O就是计算机内 ...