noip2005篝火晚会
这是一道不算太难的题,但愚蠢的我并没有想到。
首先,判断无解的情况:他想相邻的不想与他相邻。
然后,构造出合法的数列,因为第一位左边有两种选择,且构造出的环不等价,所以要做两次。
(这一点我并没有想清楚)
然后,考虑对于构造出的数列(断环为链),如何计算他与原数列的差别,即答案。
这是这道题最难的地方:如何 \(O(n)\) 的求出两个环的不同之处。
朴素算法:\(O(n^2)\),显然无法接受。
因为环无论怎么旋转,两个人的相对位置是不会变的,于是,可以对于每一个位置求出的数列与原数列的差 \(x\),表示数列要旋转 \(x\) 个位置,此位置才会与原数列重合。然后条统计出每个 \(x\) 出现的次数,\(n-max(x)\) 就是答案。
#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long
#define RG register
inline int gi()
{
RG int ret; RG bool flag; RG char ch;
ret=0, flag=true, ch=getchar();
while (ch < '0' || ch > '9')
ch == '-' ? flag=false : 0, ch=getchar();
while (ch >= '0' && ch <= '9')
ret=(ret<<3)+(ret<<1)+ch-'0', ch=getchar();
return flag ? ret : -ret;
}
const db pi = acos(-1.0);
const int N = 5e4+5, inf = 1<<30;
int n,ans,f[N],s[N],pos[N],cnt[N];
bool vis[N];
inline void cal()
{
RG int i;
for (i=1; i<=n; ++i)
cnt[(pos[i]-i+n)%n]++;
for (i=0; i<n; ++i)
ans=max(ans,cnt[i]), cnt[i]=0;
}
inline void dfs(RG int o,RG int dep)
{
pos[dep]=o;
if (dep == n)
return cal();
if (!vis[f[o]])
vis[f[o]]=true, dfs(f[o],dep+1), vis[f[o]]=false;
if (!vis[s[o]])
vis[s[o]]=true, dfs(s[o],dep+1), vis[s[o]]=false;
}
int main()
{
freopen("fire.in","r",stdin);
freopen("fire.out","w",stdout);
RG int i;
n=gi();
for (i=1; i<=n; ++i)
f[i]=gi(), s[i]=gi();
for (i=1; i<=n; ++i)
if ((f[f[i]] != i && s[f[i]] != i) || (f[s[i]] != i && s[s[i]] != i))
return puts("-1"), 0;
vis[1]=true;
dfs(1,1);
printf("%d\n",n-ans);
return 0;
}
noip2005篝火晚会的更多相关文章
- [LuoguP1053][Noip2005]篝火晚会
[LuoguP1053][Noip2005]篝火晚会(Link) 现在你有一个排成一个圈的\(N\)大小的队列,一开始的顺序是\(\{1,2,3,4...N\}\),一共有\(N\)个要求,第\(i\ ...
- NOIP2005 篝火晚会 解题报告
佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照1,2,… ...
- NOIP2005 篝火晚会
篝火晚会 (fire.pas/c/cpp) [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会. ...
- Luogu1053 NOIP2005篝火晚会
首先造出所要求的得到的环.如果将位置一一对应上,答案就是不在所要求位置的人数.因为显然这是个下界,并且脑补一下能构造出方案达到这个下界. 剩下的问题是找到一种对应方案使错位数最少.可以暴力旋转这个环, ...
- 「NOIP2005」「Codevs1106」篝火晚会
题目描述 Description 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1 ...
- [NOIP2005] 提高组 洛谷P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...
- [NOIP 2005]-- 篝火晚会
额~~,对这组题感兴趣的具体的解题报告可以戳戳这里:http://wenku.baidu.com/view/878beb64783e0912a2162aa7.html?qq-pf-to=pcqq.c2 ...
- 洛谷 P1053 篝火晚会 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从111到nnn.一开始 ...
随机推荐
- 转 Windows串口过滤驱动程序的开发
在Windows系统上与安全软件相关的驱动开发过程中,“过滤(filter)”是极其重要的一个概念.过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件 ...
- spring事务详细理解
数据并发的问题 一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库.数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性.这些 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十八 IT人教學之道-速戰
所謂IT人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...
- 为什么硬盘明明还有空间,linux却说硬盘空间不足?inode;mkdir: 无法创建目录"shen1": 设备上没有空间
现象:df -h显示硬盘还有14G空间,但是touch file/mkdir directory都失败,提示硬盘没有空间 原因:df -ia查看下inode的使用情况,发现已经爆了,(下图显示使用88 ...
- Android Studio调试工具总结
前言:写代码不可避免有Bug.通常情况下除了日志最直接的调试手段就是debug.当我们的程序出现bug时,调试能够高速的找到bug. 进入调试状态.我们能够清晰的了解程序的整个运行过程,能够对内 ...
- nexus启动报错----->错误 1067: 进程意外终止。
1.今天启动nexus报错: 2.错误信息 错误 1067: 进程意外终止. 3.检查发现我之前把jdk升级了. 然而nexus之前指定的jdk将不再生效. 4.解决的方法 找到nexus安装文件夹 ...
- chardet的使用
http://blog.csdn.net/jy692405180/article/details/52496599
- Android 组件之Service解析
原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50866875 李济洲的博客 Service是Android四大组件之中的一个.S ...
- c++程序猿经典面试题(2)
1.以下程序的输出结果是? #include<stdio.h> main(){ int b=3; int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++ ...
- C 标准库 - <stdlib.h>
C 标准库 - <stdlib.h> 简介 stdlib .h 头文件定义了四个变量类型.一些宏和各种通用工具函数. 库变量 下面是头文件 stdlib.h 中定义的变量类型: 序号 变量 ...