Codeforces 804E The same permutation(构造)
【题目链接】 http://codeforces.com/contest/804/problem/E
【题目大意】
给出一个1到n的排列,问每两个位置都进行一次交换最终排列不变是否可能,
如果可能输出交换顺序。
【题解】
我们发现对于四个一组组内进行六次交换之后可以保证四个数的位置不变,
而对于每组相互之间可以一共进行十六次交换使得两组均不会发生变化
所以如果n能被4整除,那么我们可以4个分组达到目的,
当不能被4整除的时候,我们发现余数为2和3的时候都不能构造出可行解。
在余数为1的时候有一种特殊的基于4分组的构造法,
我们在相邻两个数字交换的时候,我们将多出来的那个数字作为第三参数,
这样多出来那个数字就能够和剩余所有位置交换过一次而不改变位置。
【代码】
#include <cstdio>
#include <algorithm>
#include <utility>
#include <vector>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
typedef pair<int,int> P;
typedef vector<P> V;
void add(V &ans,int pos1,int pos2){
pos1<<=2; pos2<<=2;
rep(k,4)rep(i,4)ans.push_back(P(pos1+i,pos2+(i^k)));
}
int dx[]={0,0,1,0,1,2},dy[]={1,2,3,3,2,3};
void add4(V &ans,int pos){
pos<<=2;
rep(i,6)ans.push_back(P(pos+dx[i],pos+dy[i]));
}
V make4(int n){
V ans;
rep(i,n/4)add4(ans,i);
rep(i,n/4)rep(j,i)add(ans,j,i);
return ans;
}
int n;
void solve(){
V ans;
if(n%4==0)ans=make4(n);
else if(n%4==1){
V tmp=make4(n-1);
for(int i=0;i<tmp.size();i++){
P p=tmp[i];
int x=p.first,y=p.second;
if(x>y)swap(x,y);
if(y==x+1&&y%2){
ans.push_back(P(n-1,x));
ans.push_back(P(x,y));
ans.push_back(P(n-1,y));
}else ans.push_back(p);
}
}else{puts("NO");return;}
puts("YES");
for(int i=0;i<ans.size();i++){
P p=ans[i];
if(p.first>p.second)swap(p.first,p.second);
printf("%d %d\n",p.first+1,p.second+1);
}
}
int main(){
while(~scanf("%d",&n))solve();
return 0;
}
Codeforces 804E The same permutation(构造)的更多相关文章
- codeforces 622C. Optimal Number Permutation 构造
题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间. ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
- Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造
Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 ht ...
- Codeforces Round #309 (Div. 1) B. Kyoya and Permutation 构造
B. Kyoya and Permutation Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/ ...
- Codeforces 482 - Diverse Permutation 构造题
这是一道蛮基础的构造题. - k +(k - 1) -(k - 2) 1 + k , 1 , k , 2, ....... ...
- codeforces C. Diverse Permutation(构造)
题意:1...n 的全排列中 p1, p2, p3....pn中,找到至少有k个 |p1-p2| , |p2-p3|, ...|pn-1 - pn| 互不相同的元素! 思路: 保证相邻的两个数的差值的 ...
- Codeforces.612E.Square Root of Permutation(构造)
题目链接 \(Description\) 给定一个\(n\)的排列\(p_i\),求一个排列\(q_i\),使得对于任意\(1\leq i\leq n\),\(q_{q_i}=p_i\).无解输出\( ...
- codeforces B. Levko and Permutation 解题报告
题目链接:http://codeforces.com/problemset/problem/361/B 题目意思:有n个数,这些数的范围是[1,n],并且每个数都是不相同的.你需要构造一个排列,使得这 ...
- Codeforces 691D Swaps in Permutation
Time Limit:5000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...
随机推荐
- C#读取txt文件时中文乱码
解决办法 使用GB2312中文字符集 StreamReader reader = new StreamReader(txtUrl, Encoding.GetEncoding("gb2312& ...
- linux系统引导流程
1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...
- Perl6 Bailador框架(6):获取用户输入
use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...
- DTW 算法(转)
DTW为(Dynamic Time Warping,动态时间归准)的简称.应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中.可能大家学过这些类似的课程都看到 ...
- MACHINE_START与MACHINE_END【转】
转自:http://blog.csdn.net/cxw3506/article/details/8475965 版权声明:本文为博主原创文章,未经博主允许不得转载. 在移植Linux时,有个结构体需要 ...
- java===java基础学习(14)---封装
package dog; public class Demo4 { public static void main(String []args) { Worker w1= new Worker(&qu ...
- 神秘的subsys_initcall【转】
转自:http://blog.chinaunix.net/uid-12567959-id-161015.html 在内核代码里到处都能看到这个subsys_initcall(),而它到底是干什么的呢? ...
- mybatis模糊查询sql
今天下午做的一个功能,要用到模糊查询,字段是description,刚开始我的写法用的是sql中的模糊查询语句, 但是这个有问题,只有将字段的全部值传入其中,才能查询,所以不是迷糊查询. 后来经过搜索 ...
- Leetcode 之Binary Tree Postorder Traversal(47)
中序遍历二叉搜索树,得到的是一个有序的结果,找出其中逆序的地方就可以了.如果逆序的地方相邻,只需把逆序的相换即可:如果不相邻,则需要找到第二个逆序对的 第二个元素再做交换. 定义两个指针p和q来指定需 ...
- leetcode 之Set Matrix Zeroes(10)
设置两个布尔数组,记录行和列是否存在0.需要注意的是如何将行或列设为0. void setZeros(vector<vector<int>> &matrix) { in ...