news 2026/5/23 11:37:42

洛谷 P14944 已经没有什么好构造的了 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P14944 已经没有什么好构造的了 题解

不难发现,凸多边形最多有 33 个锐角。因此对于 �>3m>3 显然无解。否则分讨 �m 的取值,构造方法如下图所示,红线代表一段凸壳。

这样问题就变成了如何构造红色的凸壳部分。由于只能用整点,因此凸壳中线段斜率均为有理数。

这启发我们构造一串不同的正斜率并从大到小排序。具体做法就是枚举所有满足 1≤�,�≤�1≤p,q≤K 的 ��qp​,约分,排序并去重。发现 �=406K=406 时就能得到至少 105105 个不同斜率。

我们还需要证明这样做不会超出 108108 的值域限制。由于凸壳中不超过 �n 条线段,每条线段对 �,�x,y 坐标的贡献均 ≤�≤K,因此右上角的点的 �,�x,y 坐标均不会超过 ��≤4.06×107<108nK≤4.06×107<108,证毕。

注意特判掉 �≤4n≤4 的情况。

Code

#include <bits/stdc++.h> #define rept(i,a,b) for(int i(a);i<=b;++i) #define fi first #define se second #define pii pair<int,int> using namespace std; constexpr int K=406,N=K*K+5; struct Frac{ int a,b; Frac(int _a=0,int _b=1):a(_a),b(_b){ int g=gcd(a,b);a/=g,b/=g; } inline bool operator<(const Frac &rhs) const { return a*rhs.b<rhs.a*b; } inline bool operator==(const Frac &rhs) const { return a==rhs.a&&b==rhs.b; } }s[N]; int T,n,m,cnt; const vector<pii> get_convex_hull(int e){ // 返回包含e条边,左下角为(0,1)的凸壳上的点,逆时针顺序 vector<pii> res; pii cur(0,1); res.emplace_back(cur); rept(i,1,e){ cur.fi+=s[i].a; cur.se+=s[i].b; res.emplace_back(cur); } reverse(res.begin(),res.end()); return res; } signed main(){ scanf("%d",&T); rept(i,1,K) rept(j,1,K) s[++cnt]=Frac(i,j); sort(s+1,s+cnt+1); cnt=unique(s+1,s+cnt+1)-s-1; while(T--){ scanf("%d%d",&n,&m); if(n==3){ switch(m){ case 2:printf("0 0\n1 0\n0 1\n");break; case 3:printf("0 0\n2 0\n1 2\n");break; default:printf("scare\n"); } }else if(n==4){ switch(m){ case 0:printf("0 0\n1 0\n1 1\n0 1\n");break; case 1:printf("1 0\n3 1\n1 2\n0 1\n");break; case 2:printf("1 0\n2 0\n0 2\n0 1\n");break; case 3:printf("3 0\n6 4\n3 5\n0 4\n");break; default:printf("scare\n"); } }else{ vector<pii> res; int x,y; switch(m){ case 0: res=get_convex_hull(n-4); x=res[0].fi,y=res[0].se; printf("0 0\n%d 0\n%d %d\n",x+1,x+1,y); for(auto [x,y]:res) printf("%d %d\n",x,y); break; case 1: res=get_convex_hull(n-4); x=res[0].fi,y=res[0].se; printf("0 0\n%d 0\n%d %d\n",x+2,x+1,y); for(auto [x,y]:res) printf("%d %d\n",x,y); break; case 2: res=get_convex_hull(n-2); x=res[0].fi,y=res[0].se; printf("%d 1\n",x); for(auto [x,y]:res) printf("%d %d\n",x,y); break; case 3: res=get_convex_hull(n-2); x=res[0].fi,y=res[0].se; printf("%d 1\n",x+1); for(auto [x,y]:res) printf("%d %d\n",x,y); break; default: printf("scare\n"); } } } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 1:01:55

如何优化网站内容提高排名_站内搜索优化对网站SEO有什么影响

如何优化网站内容提高排名_站内搜索优化对网站SEO有什么影响 在当前竞争激烈的网络环境中&#xff0c;如何优化网站内容以提高排名&#xff0c;成为了每一个网站运营者的重要课题。尤其是在百度等大型搜索引擎平台上&#xff0c;站内搜索优化不仅是提升用户体验的重要手段&…

作者头像 李华
网站建设 2026/4/1 14:37:35

DOTA数据集:航空影像目标检测的挑战与机遇

1. DOTA数据集&#xff1a;航空影像目标检测的"黄金标准" 第一次接触DOTA数据集时&#xff0c;我被它的规模震撼到了——2806张40004000像素的高清航拍图&#xff0c;包含188,282个标注实例&#xff0c;这个数据量在航空影像领域堪称"巨无霸"。记得当时为了…

作者头像 李华
网站建设 2026/4/10 7:35:11

Nunchaku-flux-1-dev与ComfyUI集成:可视化工作流搭建指南

Nunchaku-flux-1-dev与ComfyUI集成&#xff1a;可视化工作流搭建指南 1. 开篇&#xff1a;为什么选择可视化工作流 如果你对AI画图感兴趣&#xff0c;但又不想写代码&#xff0c;那么ComfyUI可能就是你要找的工具。它用拖拽节点的方式&#xff0c;让任何人都能搭建复杂的AI图…

作者头像 李华
网站建设 2026/4/10 12:53:06

AI生成代码的安全陷阱与应对策略

引言 概述AI生成代码&#xff08;如OpenAI Codex、GitHub Copilot&#xff09;的普及及其对开发效率的提升提出潜在安全隐患&#xff1a;代码质量、漏洞引入、知识产权争议等 AI生成代码的常见陷阱 代码安全漏洞 示例&#xff1a;SQL注入、XSS等未经验证的代码片段缺乏上下文感…

作者头像 李华
网站建设 2026/4/10 7:39:08

重塑阅读未来:KOReader 2025.04突破性体验解析

重塑阅读未来&#xff1a;KOReader 2025.04突破性体验解析 【免费下载链接】koreader An ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats, running on Cervantes, Kindle, Kobo, PocketBook and Android devices 项目地址: https://gitcod…

作者头像 李华