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

2024 CCPC 河北省大学生程序设计竞赛 F题思路分享(竞赛图,构造)

题意概述

给定一个 \(n\) 个节点的竞赛图,需要把所有点划分成三个集合 \(A,B,C\),满足:

  • \(x \in A,y \in B\) ,则边方向为 \(x\)\(y\)

  • \(x \in B,y \in C\) ,则边方向为 \(x\)\(y\)

  • \(x \in C,y \in A\) ,则边方向为 \(x\)\(y\)

\(3 \le n \le 500\)

思路

如果存在合法的方案,该方案唯一。假设当前分组方案合法,除了所有元素都循环移动一组,其他移动均不合法,而循环移动相当于没有移动,因此方案唯一。

得到这个性质后,就可以比较随意地构造了。

先找到一个三元组 \(x,y,z\) ,满足 \(x\)->\(y\)->\(z\)->\(x\) ,将 \(x,y,z\) 分别分配到 \(1,2,3\) 号组。枚举所有元素,尝试加入其中一个组,因为方案唯一,可加入的组最多只有一个。如果没有组可以加入,考虑调整已加入元素。

此时唯一的调整方案为把三组合并成一组。合并之后,枚举剩下的元素,找到一个合法二元组 \(a,b\) 分别填充到第 \(2\) 组和第 \(3\) 组,如果找不到则无解。回退一位重新判断本位元素即可。

因为方案唯一,当发现某元素加不进去的时候,当前方案一定是错的,因此尝试重构是正确的。

时间复杂度 \(\mathcal{O}(n^3)\)

代码

//author:kzssCCC#include <bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){int n;cin >> n;vector<vector<int>> a(n+1,vector<int>(n+1));for (int i=1;i<=n;i++){for (int j=i+1;j<=n;j++){cin >> a[i][j];}}for (int i=1;i<=n;i++){for (int j=1;j<i;j++){a[i][j] = a[j][i]^1;}}vector<bool> vis(n+1,false);bool ok = false;vector<vector<int>> res(4);for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (j==i) continue;for (int k=1;k<=n;k++){if (k==i || k==j) continue;if (a[i][j]==1 && a[j][k]==1 && a[k][i]==1){ok = true;vis[i] = vis[j] = vis[k] = true;res[1].push_back(i);res[2].push_back(j);res[3].push_back(k);break;}}if (ok) break;}if (ok) break;}if (!ok){cout << "0 0 0" << '\n';return;}for (int i=1;i<=n;i++){if (vis[i]) continue;bool ok2 = false;for (int j=1;j<=3;j++){bool ok3 = true;for (auto& d:{-1,1}){for (auto& v:res[(j+d-1+3)%3+1]){if (d==1 && a[i][v]==0 || d==-1 && a[v][i]==0){ok3 = false;break;}}if (!ok3) break;}if (ok3){ok2 = true;res[j].push_back(i);break;}}		if (!ok2){for (auto& v:res[2]){res[1].push_back(v);}for (auto& v:res[3]){res[1].push_back(v);}res[2].clear();res[3].clear();bool ok3 = false;for (int p=i;p<=n;p++){if (vis[p]) continue;for (int q=i;q<=n;q++){if (vis[q] || p==q || a[p][q]!=1) continue;bool ok4 = true;for (auto& v:res[1]){if (!(a[v][p]==1 && a[p][q]==1 && a[q][v]==1)){ok4 = false;break;}}if (ok4){vis[p] = vis[q] = true;res[2].push_back(p);res[3].push_back(q);ok3 = true;break;}}if (ok3){break;}}if (!ok3){cout << "0 0 0" << '\n';return;}	i--;		}}for (int j=1;j<=3;j++){cout << res[j].size() << ' ';}cout << '\n';for (int j=1;j<=3;j++){for (auto& v:res[j]){cout << v << ' ';}cout << '\n';}
}int main(){ios::sync_with_stdio(false);cin.tie(0);int t = 1;// cin >> t;while (t--) solve();return 0;
}
http://www.jsqmd.com/news/822238/

相关文章:

  • 烤乐厨:以手工冻鲜串为核,定义烧烤食材新标杆 - 博客万
  • 2026广州创业必看广州注册公司别瞎跑!新政解读+3家靠谱代办推荐! - 速递信息
  • 2026组织效能提升靠谱公司推荐,十大专业咨询机构排名及核心优势盘点 - 远大方略管理咨询
  • 湖州黄金回收市场全解析:吴兴、南浔、长兴三地实测,金价高位变现指南 - 润富黄金珠宝行
  • Linux系统按键被篡改解决方法
  • 想省去自己熬制配料的麻烦,推荐一下直接放心采购的商用烤鸭、手撕鸭的成品料 - 品牌2025
  • Ansys Lumerical 有源器件仿真计算,代理商推荐 - 品牌2025
  • 2026港大港中文港科大本科怎么申请?香港本科留学中介机构推荐 - 品牌2025
  • 2026岩棉板核心厂家综合实力排行一览 欧诗德(天津)节能科技有限公司:全场景适配的高端岩棉板标杆 外墙岩棉板/岩棉保温板/防火岩棉板 - 奔跑123
  • 2026甘肃工业气体供应商综合实力五强排行 - 深度智识库
  • 2026年心肺功能测试系统供应商实力排行榜(市场分析) - 品牌推荐大师
  • 美团淘宝闪购外卖代运营:成都餐饮商家的专业增长解决方案 - 行业观察日记
  • 中国路况,中国速度——佳研AI让汽车碰撞仿真不再“卡脖子” - 品牌2025
  • 让电池包“冷静”下来:佳研AI热管理设计神器重磅发布 - 品牌2025
  • 别再找了!这7个网站,免费下载海量音效与背景音乐 - 拾光而行
  • ABC 382 E (期望 dp 好题)
  • 昆山天硕广告传媒:苏州发光字设计电话多少 - LYL仔仔
  • Al问答展示前十服务商|2026年度权威榜单 - FaiscoJeff
  • 2026年5月最新!郑州电销系统防封回拨线路服务商 TOP5 排名推荐(综合实力榜)郑州王妍工作室 - 速递信息
  • 京东e卡回收流程详解,轻松变现! - 团团收购物卡回收
  • 东莞电泳厂调研盘点 质量好的电泳加工企业参考指南 - 资讯焦点
  • 2026杭州黄金回收全指南,首选琳弘湾黄金回收(上城区/滨江区/余杭区) - 润富黄金珠宝行
  • 合肥黄金回收正规店推荐:资质齐全、报价透明、当场结算 - 奢侈品回收测评
  • 京东e卡不用了?教你秒变现金! - 团团收购物卡回收
  • 石家庄同城宝藏纹眉店被挖爆,久匠凭实力征服无数爱美女生 - 企业博客发布
  • 10分钟快速解决ESP32开发环境配置问题:Arduino-ESP32完整安装指南
  • 餐饮公播音乐:火锅 _ 西餐 _ 快餐 _ 咖啡馆 BGM 搭配 - 拾光而行
  • 2026年超声波明渠流量计厂家盘点:从国内高新企业到全球知名仪表品牌 - 品牌推荐大师1
  • 2026 成都茅台名酒回收哪家更靠谱?科学测评,多家品牌实地测评走访调研 - 资讯焦点
  • 官方认证|2026年五大正规结构胶厂家排名,山东绿康建材集团有限公司综合实力遥遥领先 - 十大品牌榜