当前位置: 首页 > news >正文

[NOIP 2005 提高组] 篝火晚会 题解

[NOIP 2005 提高组] 篝火晚会

link

\(Solution:\)

首先考虑如何判断无解。

无解判法

可以发现当\(A\)想要与\(B\)相邻,但\(B\)却不想与\(A\)相邻时,一定无解。

也就是图中一定都是双向边,同时形成一个环。

但要注意当原图中有多个环时,也是无解的。

所以当且仅当满足一下两个条件中的任意一个时,该问题无解:

1.\(A\)想要与\(B\)相邻,但\(B\)却不想与\(A\)相邻;

2.图不联通。

如果有解,那么原图一定形成了一个环。

而这个环就是最终的期望序列,记为\(B\)

记初始序列为\(A\),则\(A={1,2,3,...,n-1,n}\)

虽然\(B\)已经确定,但是\(B\)是一个环,与\(A\)\(2n\)中匹配方式(正倒各\(n\)种)。

那么我们考虑对于固定的\(A\)\(B\),如何计算答案。

计算方法

可以发现\(A\)\(B\)都是两个排列,那么这就是一个经典的排列置换问题。

\(B_i\)\(i\)连边,这样原图中会形成若干个环。

对于每一个点数大于 2 的环,都需要花费点数的代价将其处理。

那么答案也就相当于\(n-\sum{[B_i==i]}\)

如果我们直接枚举\(B\),时间复杂度:\(O(n^2)\),可以得到 30 pts。

可以发现,我们本质上要让\(\sum{[B_i==i]}\)最大。

也就是让尽可能多的\(B_i=i\)

而要想让\(B_i=i\),则需要变换\((B_i-i) \ mod \ n\)次。

那么对于每个\((B_i-i) \ mod \ n\)开桶记录,去最大值,就是答案最大的转法。

记最大值为\(c\),则最小总代价为\(n-c\)

时间复杂度:\(O(n)\)

code

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define inf 1e10
#define eps 1e-9
#define endl "\n"
#define il inline
#define ls 2*k
#define rs 2*k+1
using namespace std;
const int N=1e5+5;
const int mod=998244353;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
bool vis[N];
int n,pos[N],top,cnt[N];
pair<int,int> p[N];
map<pair<int,int>,bool>mp;
vector<int>E[N];
inline void dfs(int x,int fa){vis[x]=1;pos[++top]=x;for(auto to : E[x]){if(vis[to]) continue;dfs(to,x);}return ;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>n;for(int i=1,x,y;i<=n;i++){cin>>x>>y;p[i]={x,y};mp[{i,x}]=1;mp[{i,y}]=1;}bool ok=1;for(int i=1;i<=n;i++){int x=p[i].first,y=p[i].second;if(!mp[{x,i}] || !mp[{y,i}]) ok=0;}if(!ok){cout<<"-1\n";exit(0);}for(int i=1;i<=n;i++){int x=p[i].first,y=p[i].second;E[i].push_back(x);E[i].push_back(y);}dfs(1,0);if(top<n){cout<<"-1\n";exit(0);}for(int i=1;i<=n;i++)cnt[((i-pos[i])%n+n)%n]++;int ans=inf,Max=0;for(int i=0;i<n;i++) Max=max(Max,cnt[i]),cnt[i]=0;for(int i=1;i<=n;i++)cnt[((pos[i]-(n-i+1))%n+n)%n]++;ans=min(ans,n-Max); Max=0;for(int i=0;i<n;i++) Max=max(Max,cnt[i]);ans=min(ans,n-Max);cout<<ans<<'\n';return 0;
}
http://www.jsqmd.com/news/361471/

相关文章:

  • 2026年热门的倒角复合锯切专机/型钢在线跟切锯切专机实力工厂参考哪家靠谱(高评价) - 行业平台推荐
  • 收藏备用|程序员转型AI大模型:8大热门岗位+转行全攻略(小白必看)
  • 收藏!新人转行大模型赛道全攻略|小白/程序员必看,少走1年弯路
  • 收藏!小白程序员必看:大模型核心能力“记忆”全解析与实战指南
  • 意义的本质:解决真实问题,创造真实价值
  • 收藏!35岁程序员转行大模型领域,8步落地规划(小白也能跟着学)
  • 事件意义与菩提心:两种普世路径的深层辨析
  • Top5核磁共振波谱仪主流品牌盘点与实力厂家解析 - 品牌推荐大师1
  • [MCP-UI] Interactive
  • 必收藏!RAG(检索增强生成)核心解析,小白程序员也能轻松吃透的大模型刚需技术
  • 2026年2月江苏水泥管/顶管/预制检查井/企口管/承插管厂家哪家好?综合选购推荐与行业深度解析 - 2026年企业推荐榜
  • 解码RS485与Modbus通信及CRC16校验
  • mbedtls之实现des mac_xor算法
  • 收藏级!大模型底层原理详解(从极简到初级,小白程序员必看)
  • 解决JSP框架的程序无法找到前端页面的问题
  • 万物皆有意义:活出个体精彩与意义信仰的实践框架
  • AbMole小讲堂丨Luteolin(木犀草素):一种具有抗炎、抗氧化、抗肿瘤活性的天然产物及其科研应用
  • 收藏备用|Java程序员转AI大模型指南:零弯路转型,解锁职场新赛道
  • 2026年玻璃极窄门TOP5品牌综合评测与选型指南 - 2026年企业推荐榜
  • 2000-2024年 上市公司-重污染行业分组数据 (+文献)
  • 如何通过 5 种有效方法同步 Android 和 Mac
  • 意义视角下的终极追问:善恶、命运与存在的深层逻辑
  • 云翼超算 全球领先自主知识产权新一代非线性数字化仿真软件
  • 2026 年 IT 转行别再选错!网络安全才是真正的黄金赛道
  • 2026年靠谱的心理咨询室仪器/心理咨询室产品系统热门型号选购指南 - 行业平台推荐
  • 如何安全轻松地出售损坏的 iPhone
  • 研究生救星!2026实测AI论文生成软件榜单,这5款直接封神
  • 揭秘CANN算子仓库:从基础算子到AIGC性能突破的实战之路
  • 新手也能上手!降AIGC软件 千笔AI VS 云笔AI,本科生专属神器
  • 协助医疗机构,提升医疗行业界面水平