题目描述

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

Solution:

  本题ZYYS,noip好坑啊。

  坑点在于题面描述的$b_1,b_2…b_n$是指原数列的一个子序列而不是从1开始连续的一段,这样题目就简单了。

  我们先处理出给定的目标序列,若有冲突就输出-1。

  一个结论是答案=$n-p$($p$为最大的位置对应的个数)。

  证明很简单:位置对应的数肯定不用移动了,然后没有对应的数,就将其分为几个群,必须保证同一群内通过一次移动就能到达对应位置,这样是一定成立的,因为操作等价于使得不对应的数有序,而每次操作是将最后一个元素前移,所以我们选择分群的方式时,若有一段连续上升的就补一个最小的在后面,若没有也能弄出两个数交换的情况,由于每次花费是群的元素个数,总花费当然是$n-p$咯。

  然后问题就转化为如何快速求出$p$,由于是循环序列,所以我们可以处理出每个数到对应位置应该需要移动的步数(要么向左,要么向右),那么我们只要开桶统计每个步数能让数对应的最大个数就好了(向左向右各做一遍)。

代码:

/*Code by 520 -- 9.2*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define il inline
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,l[N],r[N],a[N],b[N],c[N],ans;
bool vis[N]; int main(){
scanf("%d",&n);
For(i,,n) scanf("%d%d",&l[i],&r[i]);
a[]=,a[]=l[];
For(i,,n) {
if(a[i-]==l[a[i]]) a[i+]=r[a[i]];
else if(a[i-]==r[a[i]]) a[i+]=l[a[i]];
else cout<<-,exit();
}
if(a[]!=a[n+]) cout<<-,exit();
For(i,,n) if(!(vis[i]^)) cout<<-,exit();else vis[i]^=;
For(i,,n) b[(a[i]-i+n)%n]++,c[(a[n-i+]-i+n)%n]++;
For(i,,n-) ans=max(ans,max(b[i],c[i]));
cout<<n-ans;
return ;
}

P1053 篝火晚会的更多相关文章

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

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

  2. 洛谷P1053 篝火晚会

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

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

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

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

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

  5. LUOGU P1053 篝火晚会 (Noip 2015 )

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

  6. 洛谷 P1053 篝火晚会

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

  7. luogu P1053 篝火晚会

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

  8. NOIP2005 篝火晚会 解题报告

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

  9. NOIP2005 篝火晚会

    篝火晚会 (fire.pas/c/cpp) [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会. ...

随机推荐

  1. Training: MySQL I (MySQL, Exploit, Training)

    题目链接:http://www.wechall.net/challenge/training/mysql/auth_bypass1/index.php?highlight=christmas 的确是非 ...

  2. 强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces)

    强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces) 学习笔记: Reinforcement Learning: An Introduction, Richard S. S ...

  3. moment.js使用方法总结

    Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率.日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等 ...

  4. Jenkins配置 管理

    Jenkins配置 你可能已经看了前面几次练习了,其中我们不得不在Jenkins配置选项.下表列出了Jenkins 的各种配置选项. 因此,可以通过点击左侧菜单侧的 “Manage Jenkins”选 ...

  5. SICP读书笔记 1.2

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  6. Python基础入门(模块和包)

    1 模块 1.1 什么是模块 在 Python 中,一个 .py 文件就称之为一个模块(Module). 我们学习过函数,知道函数是实现一项或多项功能的一段程序 .其实模块就是函数功能的扩展.为什么这 ...

  7. Bellman-ford 模板

    #include<bits/stdc++.h> const int inf=0x3f3f3f3f; ; struct edge{ int u,v;//两个点 int w; //权值 Edg ...

  8. hdfs遍历文件方法

    import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org. ...

  9. LeetCode--147.对链表进行插入排序

    题目描述: 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插入排序算法 ...

  10. Switch Game :因子数

    A - Switch Game Problem Description There are many lamps in a line. All of them are off at first. A ...