题目描述

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有 nnn 个同学,编号从 111 到 nnn 。一开始,同学们按照 1,2,…,n1,2,…,n1,2,…,n 的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。

佳佳可向同学们下达命令,每一个命令的形式如下:

(b1,b2,…bm−1,bm)(b_1, b_2,… b_{m-1}, b_m)(b1​,b2​,…bm−1​,bm​)

这里 mmm 的值是由佳佳决定的,每次命令 mmm 的值都可以不同。这个命令的作用是移动编号是 b1,b2,…,bmb_1,b_2,…, b_mb1​,b2​,…,bm​ 的这m个同学的位置。要求 b1b_1b1​ 换到 b2b_2b2​ 的位置上, b2b_2b2​ 换到 b3b_3b3​ 的位置上,……,要求 bmb_mbm​ 换到 b1b_1b1​ 的位置上。执行每个命令都需要一些代价。我们假定如果一个命令要移动 mmm 个人的位置,那么这个命令的代价就是 mmm 。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

输入输出格式

输入格式:

第一行是一个整数 n(3≤n≤50000)n(3 \le n \le 50000)n(3≤n≤50000) ,表示一共有 nnn 个同学。

其后 nnn 行每行包括 222 个不同的正整数,以一个空格隔开,分别表示编号是 111 的同学最希望相邻的两个同学的编号,编号是 222 的同学最希望相邻的两个同学的编号,……,编号是 nnn 的同学最希望相邻的两个同学的编号。

输出格式:

一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出 −1-1−1 。

输入输出样例

输入样例#1:

4

3 4

4 3

1 2

1 2

输出样例#1:

2

说明

对于30%的数据, n≤1000

对于全部的数据, n≤50000

2005提高组第三题

解题思路

首先此题有一个坑点是b是可以不连续的,也就是随便跳就行了。所以对于任意一个不匹配的点,可以让它到它的匹配点,它的匹配点在出来继续往后跳到它的匹配点的匹配点,以此类推就可以使数列匹配,最后的代价就是跳的次数,但这是O(n^2)的,考虑优化。因为它是一个环,所以就可以旋转这个操作,只需要记一个num数组,表示每个匹配点到原来点的距离的个数。然后取这个距离的个数的最大值mx,n-mx即为答案,因为我们可以将环旋转,使这mx个点达到匹配,剩余的点就为n-mx。注意还要反着跑一遍。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
const int MAXN = 50005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} int n,cnt,num[MAXN];
int a[MAXN][3];
int now[MAXN],ans=1e9;
bool vis[MAXN]; int main(){
n=rd();
for(register int i=1;i<=n;i++) a[i][1]=rd(),a[i][2]=rd();
for(register int i=1;i<=n;i++)
if((a[a[i][1]][1]!=i && a[a[i][1]][2]!=i )
||(a[a[i][2]][1]!=i && a[a[i][2]][2]!=i)){
puts("-1");
return 0;
}
int x=a[1][1];now[++cnt]=1;vis[1]=1;
while(x!=1){
if(vis[x]) break;
now[++cnt]=x;
vis[x]=1;
if(!vis[a[x][1]]) x=a[x][1];
else x=a[x][2];
}
for(register int i=1;i<=n;i++) num[(i-now[i]+n)%n]++;
for(register int i=0;i<n;i++) ans=min(ans,n-num[i]),num[i]=0;
cnt=0;now[++cnt]=1;memset(vis,false,sizeof(vis));x=a[1][2];vis[1]=1;
while(x!=1){
if(vis[x]) break;
now[++cnt]=x;
vis[x]=1;
if(!vis[a[x][1]]) x=a[x][1];
else x=a[x][2];
}
for(register int i=1;i<=n;i++) num[(i-now[i]+n)%n]++;
for(register int i=0;i<n;i++) ans=min(ans,n-num[i]);
printf("%d",ans);
return 0;
}

LUOGU P1053 篝火晚会 (Noip 2015 )的更多相关文章

  1. [luogu]P1053 篝火晚会[数学][群论]

    [luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...

  2. luogu P1053 篝火晚会

    传送门 首先如果题目的目标状态不是一个环就不合法 然后先把这个环搞出来,然后每个位置上的数对这个数对应的位置连边,可以发现有若干个环,而只要对这些环执行操作就好了,答案上界显然是\(n\).然后,如果 ...

  3. 洛谷 P1053 篝火晚会 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  4. 洛谷P1053 篝火晚会

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到 ...

  5. P1053 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从111到nnn.一开始 ...

  6. [NOIP2005] 提高组 洛谷P1053 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...

  7. 洛谷 P1053 篝火晚会

    https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...

  8. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  9. Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)

    Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...

随机推荐

  1. <jsp:forward page=""></jsp:forward>标签失效异常

    解决方案:在web.xml <filter-mapping>          <filter-name>struts2</filter-name>         ...

  2. python 虚拟环境virtualenv搭建

    一.安装虚拟环境 pip install  virtualenv -i  https://pypi.douban.com/simple   用国内镜像,速度更快 二.创建虚拟目录 在需要存放软件工程的 ...

  3. 11-7-this的最基本认识

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JS实用插件

    1. jQuery鼠标滚轮事件插件Mouse Wheel 下载链接:https://github.com/brandonaaron/jquery-mousewheel/ 使用方法: // using ...

  5. 更新CM版本

    照着这个文章搭建的 https://blog.csdn.net/sinat_32176947/article/details/79597073 需要注意问题有 离线需要自己配置yum 地址base地址 ...

  6. springboot4.1.1的log4j2配置

    一.默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台: 日志输出内容元素具体如下: 时间日期:精确到毫秒 日志级别:ERROR, WARN, INFO, D ...

  7. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

  8. Lua程序设计之数值

    (摘自Lua程序设计) 数值常量 从Lua5.3版本开始Lua语言为数值格式提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点类型(注意,"float" ...

  9. RN 环境搭建 运行demo App

    1.环境搭建 1.1 JDK 1.2Android JDK  需要安装c++环境(我选择安装android studio) 1.3Node npm config set registry https: ...

  10. linux服务器项目搭建常用命令

    linux下载链接文件 wget -c 后面是该网络地址和文件的位置. 例如:wget -c http://apache.opncas.or/MySQL/MySQL-7/v7.0.67/bin/MyS ...