题目描述

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有 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. JDK源码阅读--Object

    在java.lang包下 Object类:是所有类的基类(父类) public final native Class<?> getClass(); 返回这个Object所代表的的运行时类 ...

  2. 转:shell笔试题

    源地址:http://blog.csdn.net/zcsylj/article/details/6799632 1.用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录 ...

  3. shell 的基本理解

    shell 事先通过一个变量设定好了多个路径,当用户输入命令时,shell会自动到这些路径(由左向右)以此查找 与命令名称相同的可执行文件 hash 用来保存以前曾经执行过的命令,以哈希表的方式保存, ...

  4. XJOI夏令营501训练1——分配工作

    传送门:QAQQAQ 题意:某公司有工作人员x1,x2,…,xn ,他们去做工作y1,y2,…,ym(n<=m) ,每个人都能做其中的几项工作,并且对每一项工作都有一个固定的效率.问能否找到一种 ...

  5. Synchronized理解及用法

    加锁: 1.同步实例方法,锁是当前实例对象 2.同步类方法,锁的是当前类对象 3.同步代码块,锁是括号里面的对象 原理: JVM内置锁通过synchronized使用,通过内部对象Monitor(监视 ...

  6. python 之 字符串处理

    分割字符串 根据某个分割符分割 >>> a = '1,2,3,4' >>> a.split(',') ['] 根据多个分隔符分割 >>> line ...

  7. (Eclipse) 安装Subversion1.82(SVN)插件

    简介    :SVN是团队开发的代码管理工具,它使我们得以进行多人在同一平台之下的团队开发. 解决问题:Eclipse下的的SVN插件安装. 学到    :Eclipse下的的SVN插件安装. 资源地 ...

  8. error C2440 “static_cast” 无法从“void (__thiscall C* )(void)...

    1.VC6中,说可以把函数在头文件中定义为:afx_msg void OnProgress()这样 但是在VS2005及以上,要求很严格,必须函数返回值为LRESULT类型,所以在VS2005及以上, ...

  9. Laravel 指定日志生成目录

    1.在config/logging.php 中, 创建自定义频道 2.使用时指定频道

  10. 前端在本地启动服务预览html页面

    在开发移动端项目时浏览器里出来的效果往往到真机上和预想的有出入,在开发过程中知道了一个可以在本地自己启动一个服务器在手机预览的办法. 1.首先在终端安装http. npm i http-server ...