CodeForces 164D Minimum Diameter

news/2024/9/20 7:46:53/文章来源:https://www.cnblogs.com/zltzlt-blog/p/18421683

洛谷传送门

CF 传送门

先二分答案 \(x\),然后建一张图,距离 \(> x\) 的连边,问题转化为判定这张图的最小点覆盖大小 \(\le k\)

观察到 \(k\) 很小,可以考虑指数级做法。考虑直接搜索,每次把度数最大的点拿出来,枚举它选不选。但是这样最坏复杂度是 \(O(2^k n)\) 的。

发现最大度数 \(\le 2\) 的情况图就是一些环和一些链。对于一个环和链可以直接算出它的最小点覆盖,所以这种情况不用继续搜。

于是每一层搜索可能选 \(1\) 和点或选 \(\ge 3\) 个点。判定的复杂度就是 \(T(k) = T(k - 1) + T(k - 3) + O(n)\)。外面还有一个二分,但是可过。

另一道爆搜求最小点覆盖的题是 P9257 [PA 2022] Mędrcy。

code
// Problem: D. Minimum Diameter
// Contest: Codeforces - VK Cup 2012 Round 3
// URL: https://codeforces.com/problemset/problem/164/D
// Memory Limit: 256 MB
// Time Limit: 1500 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;const int maxn = 1010;ll n, m, a[maxn], b[maxn];
int deg[maxn], stk[maxn], top;
bool e[maxn][maxn], mk[maxn], vis[maxn];
vector<int> G[maxn];void dfs2(int u) {mk[u] = 0;stk[++top] = u;for (int v : G[u]) {if (mk[v]) {dfs2(v);}}
}bool dfs(vector<int> vc, int d) {if (d > m) {return 0;}if (vc.empty()) {return 1;}int p = 0;for (int x : vc) {if (!p || (deg[x] > deg[p])) {p = x;}}if (!deg[p]) {return 1;}if (deg[p] <= 2) {for (int x : vc) {mk[x] = 1;}int s = 0;for (int x : vc) {if (mk[x] && deg[x] == 1) {top = 0;dfs2(x);s += top / 2;for (int i = 1 + (top & 1); i < top; i += 2) {vis[stk[i]] = 1;}}}for (int x : vc) {if (mk[x] && deg[x] == 2) {top = 0;dfs2(x);s += (top + 1) / 2;for (int i = 1; i <= top; i += 2) {vis[stk[i]] = 1;}}}if (s + d <= m) {return 1;} else {for (int x : vc) {vis[x] = 0;}return 0;}}vis[p] = 1;vector<int> nv;for (int x : vc) {if (x != p) {deg[x] -= e[p][x];nv.pb(x);}}if (dfs(nv, d + 1)) {return 1;}vis[p] = 0;for (int x : vc) {if (x != p) {deg[x] += e[p][x];}}vector<int>().swap(nv);for (int x : vc) {mk[x] = 1;}for (int x : vc) {if (x == p) {continue;}if (e[p][x]) {vis[x] = 1;for (int y : G[x]) {deg[y] -= (y != p && mk[y]);}} else {nv.pb(x);}}for (int x : vc) {mk[x] = 0;}if (dfs(nv, d + deg[p])) {return 1;}for (int x : vc) {mk[x] = 1;}for (int x : vc) {if (x == p) {continue;}if (e[p][x]) {vis[x] = 0;for (int y : G[x]) {deg[y] += (y != p && mk[y]);}} else {nv.pb(x);}}for (int x : vc) {mk[x] = 0;}return 0;
}inline bool check(ll x) {mems(e, 0);mems(deg, 0);mems(mk, 0);mems(vis, 0);for (int i = 1; i <= n; ++i) {vector<int>().swap(G[i]);}for (int i = 1; i <= n; ++i) {for (int j = i + 1; j <= n; ++j) {if ((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]) > x) {e[i][j] = e[j][i] = 1;G[i].pb(j);G[j].pb(i);++deg[i];++deg[j];}}}vector<int> vc;for (int i = 1; i <= n; ++i) {vc.pb(i);}return dfs(vc, 0);
}void solve() {scanf("%lld%lld", &n, &m);for (int i = 1; i <= n; ++i) {scanf("%lld%lld", &a[i], &b[i]);}ll l = 0, r = 3e9, ans = -1;while (l <= r) {ll mid = (l + r) >> 1;if (check(mid)) {ans = mid;r = mid - 1;} else {l = mid + 1;}}check(ans);for (int i = 1; i <= n; ++i) {if (vis[i]) {printf("%d ", i);--m;}}for (int i = 1; i <= n && m; ++i) {if (!vis[i]) {printf("%d ", i);--m;}}
}int main() {int T = 1;// scanf("%d", &T);while (T--) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800301.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Parquet.Net: 将 Apache Parquet 移植到 .NET

Parquet.Net 是一个用于读取和写入 Apache Parquet 文件的纯 .NET 库,使用MIT协议开源,github仓库:https://github.com/aloneguid/parquet-dotnet。Apache Parquet 是一种面向大数据的列式存储格式。Parquet.Net 支持 .NET 4.5 及以上版本和 .NET Standard 1.4 及以上版本,…

读构建可扩展分布式系统:方法与实践09可扩展数据库基础

可扩展数据库基础1. 可扩展数据库基础 1.1. 绝大多数应用程序都是基于关系数据库技术构建的 1.2. 数据库必须存储大量数据,为分布在全球的客户端提供快速的查询响应,并且全天候可用 1.3. NoSQL数据库采用简单的数据模型,可以复制和分区以支持海量数据集和请求量 1.4. Facebo…

张量 矩阵乘法优化

张量 矩阵乘法优化 在SIMT架构下, 不使用TensorCore进行矩阵乘法,计算所需要的访存相关的优化。通过逐步迭代优化,深入理解GPU的性能特征和内存访问优化。 测试环境为一块A10 GPU, 驱动版本: 550.54.15, CUDA版本: 12.4 . 矩阵M=N=K=4092,见表6-5。 表6-5 cuBLAS调用,在每…

通用矩阵乘法执行

通用矩阵乘法执行 使用两个手工实现的纯粹GEMM和分块GEMM的例子来解释矩阵分块乘法的原理和性能影响, 可以看到性能差距接近53倍. 按照测试的A10 GPU峰值FP32算力31TFFLOPS来算, 最朴素的算法由于访存效率的问题, 浮点算力仅为峰值的1%。 # ./naive AveragePerformance 0.233…

交易柜台系统技术名词

目录交互示意图柜台API前置机行情和交易接口生产环境服务器托管(Co-location)什么是高频交易 (HFT)?交互示意图 程序化交易用户是如何与期货公司、交易所进行信息交互的?柜台 依据国内监管要求,客户无法直连交易所系统,中间必须经过期货公司(Broker)的系统,这便是柜台系…

全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

在Python中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类的结构和强制子类实现特定的方法,Python 没有内建的接口机制,但可以通过抽象基类(ABC)来模拟接口的行为。全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类摘要: 在 Py…

javafx jlink 遇到的非模块化的依赖打包报错“模块异常”的问题和处理

javafx jlink 遇到的问题和处理 简介 javafx:jlink 是 javafx-maven-plugin 插件中的一个目标,用于创建一个自包含的 JavaFX 应用程序运行时映像。这个目标利用 Java 的 jlink 工具来生成一个包含应用程序及其所有依赖的定制化运行时映像,从而简化部署和分发。创建自包含运行…

The minimum required version for Powerlevel10k is 5.1

目录一、背景二、原因三、解决1、安装 ZSH 最新版本2、效果3、下载了还是显示 ZSH 版本为 5.0.2 怎么办 一、背景 安装 ZSH 主题 Powerlevel10k 时报错:You are using ZSH version 5.0.2. The minimum required version for Powerlevel10k is 5.1. Type echo $ZSH_VERSION to …

Python pycryptodome类库使用学习总结

AES数据加解密 以下代码生成一个新的AES-128密钥,并将一段数据加密到一个文件中。我们使用 CTR 模式(这是一种 经典操作模式, 简单但不再推荐)。 仅使用CTR,接收者无法检测到密文(即加密数据)在传输过程中是否被修改。为了应对这种风险,例中还附加了一个MAC身份验证标签…

电脑设置系统不自动更新

1、win + R 2、计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\StateVariables 3、右边空白处右击 -> 新建 -> DWORD值,命名为FlightSettingsMaxPauseDays,点击基数选择十进制,数值设置为9999(表示不更新的天数)

同花顺--涨停板改变颜色

复制以下代码 IF(C>=REF(C,1)*1.095 AND C=H) RETURN "涨停"; 然后进行操作: 1、打开同花顺软件,右击K线,单击修改K线2、光标挪到代码首行行首,回车换行3、粘贴一下4、点击设置标志5、命名为涨停,选颜色,填充打勾6、点击确定

关于零值和nil

1. 零值 零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。 对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。 对于引用类型: 均为 n…