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

25普及联考day6爆炸记

省流:弘文。

一共四个题。大概开考后 20min 过了 T1, T2, T3。然后仔细想了想发现 T2 读错题了。改了 30min 才改出来,中间去水了一会 QQ。

然后想 T4,很快想出解法,然后开始写了。

然后一直写到比赛结束,写了 5K?????为了防止自己以后再犯这种神志不清的错误,这里放一下考场错误仅有 15pts 代码来警示自己。


/*
Solution:*/
#include <bits/stdc++.h>using ll = long long;
using ull = unsigned long long;
//using i28 = __int128_t;
//using u28 = __uint128_t;
using ldb = long double;#define int long long
#define max(x, y) (x > y ? x : y)
#define min(x, y) (x < y ? x : y)
#define abs(x) (x < 0 ? -x : x)constexpr int N = 5e5 + 10;
int n, m, Xcnt, q;int anc[N], sz[N]; 
int find(int u) {if (anc[u] == u) return u;else return anc[u] = find(anc[u]); 
}
void merge(int u, int v) {u = find(u), v = find(v);if (u != v) sz[v] += sz[u], anc[u] = v; 
}int rid[N];
struct node {int sz; std::vector <int> vec;bool operator < (const node &cmp) const {return sz > cmp.sz; }
} a[N]; 
std::vector <int> vec[N];  signed main() {
//	freopen(".in", "r", stdin), freopen(".out", "w", stdout);std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);std::cin >> n >> m >> Xcnt >> q;for (int i = 1; i <= n; ++i) {anc[i] = i, sz[i] = 1; }while (q --> 0) {int _u, _v; std::cin >> _u >> _v;merge(_v, _u); }if (m > (n - 1) * n) {return std::cout << "-1\n", 0; }int tmp = 0, tmp2 = 0, tot = 0;for (int i = 1; i <= n; ++i) if (find(i) == i) {tmp += (sz[i] == 1 ? 0 : sz[i]), a[++tot].sz = sz[i], rid[i] = tot, a[tot].vec.emplace_back(i);} else a[rid[find(i)]].vec.emplace_back(i);if (tmp > m || tot < Xcnt) {return std::cout << "-1\n", 0; } m -= tmp; std::sort(a + 1, a + 1 + tot);if (m < 0) {return std::cout << "-1", 0;}// merge to Xcnt connected blocks with no cost
//	for (int i = 1; i <= tot; ++i) {
//		std::cout << a[i].sz << " : "; for (auto j : a[i].vec) std::cout << j << " "; std::cout << "\n";
//	}int new_sz = a[1].sz;std::vector <int> new_vec = a[1].vec; for (int i = 2; i <= tot - Xcnt + 1; ++i) { // merge i and i - 1if (new_sz == 1) --m; if (a[i].sz == 1) --m; new_sz += a[i].sz;for (auto j : a[i].vec) new_vec.emplace_back(j); 
//		std::cout << i << "\n";}if (m < 0) return std::cout << "-1\n", 0;a[1].sz = new_sz, a[1].vec = new_vec;int pos = 1; for (int i = tot - Xcnt + 2; i <= tot; ++i) a[++pos] = a[i];for (int i = Xcnt + 1; i <= tot; ++i) a[i].sz = 0, a[i].vec.clear(); //	std::cout << m << "\n";
//	for (int i = 1; i <= Xcnt; ++i) {
//		std::cout << a[i].sz << " : ";
////		for (auto j : a[i].vec) std::cout << j << " "; std::cout << "\n";
//		for (int j = 0; j < a[i].vec.size(); ++j) std::cout << a[i].vec[j] << " "; std::cout << "\n";
//	}
//	std::cout << m << "\n";// checktmp = 0;int tmpm = m; for (int i = 1; i <= Xcnt; ++i) {int cur = (a[i].sz - 1) * a[i].sz - a[i].sz;tmpm -= cur; }int cursz = a[1].sz;for (int i = 2; i <= Xcnt; ++i) {int cur = cursz * a[i].sz;tmpm -= cur, cursz += a[i].sz; }if (tmpm > 0) {return std::cout << "-1\n", 0; }//for (int i = 1; i <= Xcnt; ++i) {for (int j = 0; j < a[i].vec.size() - 1; ++j) {std::cout << a[i].vec[j] << " " << a[i].vec[j + 1] << "\n"; }if (a[i].sz > 1) std::cout << a[i].vec.back() << " " << a[i].vec.front() << "\n"; }for (int i = 1; i <= Xcnt; ++i) {int cur = (a[i].sz - 1) * a[i].sz - a[i].sz;if (m <= cur) {for (int j = 1; j < i; ++j) {for (int k = 0; k < a[j].vec.size(); ++k) for (int h = 0; h < a[j].vec.size(); ++h) if (k != h) {if (h == k + 1) continue ;if (k == 0 && h == a[j].vec.size() - 1) continue ; std::cout << a[j].vec[k] << " " << a[j].vec[h] << "\n"; }}int p = 0;while (m > 0) {for (int j = 0; j < a[i].vec.size(); ++j)if (p != j) {if (p != j + 1 && !(j == a[i].vec.size() - 1 && p == 0)) {std::cout << a[i].vec[j] << " " << a[i].vec[p] << "\n";--m;if (m == 0) break ; }if (j != p + 1 && !(p == a[i].vec.size() - 1 && j == 0)) {std::cout << a[i].vec[p] << " " << a[i].vec[j] << "\n";--m;  if (m == 0) break ; }}++p; }return 0; }m -= cur; }int cur_sz = a[1].sz;for (int i = 2; i <= Xcnt; ++i) { // merge i and i - 1int add = a[i].sz * cur_sz;if (m <= add) {std::vector <int> ans;for (int j = 1; j <= Xcnt; ++j) {for (int k = 0; k < a[j].vec.size(); ++k) for (int h = 0; h < a[j].vec.size(); ++h) if (h != k) {if (h != k + 1 && !(k == a[j].vec.size() - 1 && h == 0)) std::cout << a[j].vec[k] << " " << a[j].vec[h] << "\n";if (k != h + 1 && !(h == a[j].vec.size() - 1 && k == 0)) std::cout << a[j].vec[h] << " " << a[j].vec[k] << "\n";}}for (int j = 1; j < i; ++j) for (auto k : a[j].vec) ans.emplace_back(k);
//			for (auto j : ans) for (auto k : ans) if (j != k) std::cout << j << " " << k << "\n";for (int j = 1; j < i; ++j) {for (int k = j + 1; k < i; ++k)for (auto a1 : a[j].vec) for (auto a2 : a[j].vec) std::cout << a1 << " " << a2 << "\n"; }int p = 0; while (m > 0) {for (auto j : a[i].vec) {std::cout << ans[p] << " " << j << "\n";--m; if (m == 0) break ; std::cout << j << " " << ans[p] << "\n"; --m; } ++p; }return 0;} m -= add, cur_sz += a[i].sz; }std::cout << "-1\n"; return 0;
}

大概是不知道自己写了什么。

比赛成绩出来是 \(100 + 90 + 100 + 15\),预计是 \(100 + 100 + 100 + [0, 100]\)。自闭了。

http://www.hskmm.com/?act=detail&tid=22538

相关文章:

  • unity面向组合开发一:面向对象(OOP)与面向组合(EC)
  • 两级页表
  • 复健。(10月,OI)
  • 实用指南:自动驾驶中的传感器技术55——USS(1)
  • 市场交易反心理特征之三:日内假反转
  • 实用指南:云服务器 + Jenkins 实现项目自动化部署与上线
  • Linux 中awk命令如何统计每行指定字符出现的次数
  • 常系数齐次微分方程
  • 变量
  • 具有快表的地址变换机构
  • 关于子集的枚举与高维前缀和
  • HyperWorks 14.0 轮毂仿真全流程详细教程
  • 原来的OJ怎么没了?
  • 【Linux】库的链接与加载 - 详解
  • CSP-S模拟26
  • 存在是必然的有机系统,好事多磨,心诚则灵
  • 2025 年陶土砖厂家权威推荐 TOP 品牌排行榜,劈开 / 红色 / 干挂 / 砌筑 / 仿古 / 透气 / 耐火 / 异型 / 装饰 / 外墙陶土砖产品厂家推荐
  • AGC015E Mr.Aoki Incubator
  • 2025 年臭氧发生器厂家 TOP 实力工厂推荐榜单排名,大中型 / 水处理 / 多功能臭氧发生器推荐这十家公司!
  • 2025 年采光瓦厂家 TOP 企业品牌推荐排行榜,详解数字化工厂与就近发货实力采光瓦推荐这十家公司!
  • 2025 年合成树脂瓦厂家 TOP 企业品牌推荐排行榜,防腐方案与定制能力全景对比合成树脂瓦公司推荐!
  • 2025 年人造草坪足球场厂家推荐 TOP10 品牌权威排行榜单,深度剖析人造草坪足球场行业优势公司
  • 2025 年望远镜厂家 TOP 企业品牌推荐排行榜,助你精准选购性价比高的望远镜推荐这十家公司!
  • Coze源码分析-资源库-删除数据库-后端源码-安全与错误处理 - 详解
  • 动手动脑实验性问题总结
  • 链表实现双端队列
  • FFmpeg和ZLMediaKit 实现本地视频推流
  • SQL 多表查询速查:JOIN、子查询一文全掌握 - 详解
  • 深入解析:数字和字节:Linux 中的内存如何工作?
  • AtCoder Beginner Contest 424 425 部分题解