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

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

Solution

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

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

这启发我们构造一串不同的正斜率并从大到小排序。具体做法就是枚举所有满足 \(1\le p,q\le K\)\(\frac{p}{q}\),约分,排序并去重。发现 \(K=406\) 时就能得到至少 \(10^5\) 个不同斜率。

我们还需要证明这样做不会超出 \(10^8\) 的值域限制。由于凸壳中不超过 \(n\) 条线段,每条线段对 \(x,y\) 坐标的贡献均 \(\le K\),因此右上角的点的 \(x,y\) 坐标均不会超过 \(nK\le 4.06\times 10^7<10^8\),证毕。

注意特判掉 \(n\le 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;
}
http://www.jsqmd.com/news/350334/

相关文章:

  • try/catch+async/await与Promise.then对比
  • Skills 出世,Prompt 已死?2026 年,如何为 Agent 构建可控思维?
  • 制药业CRM系统需求激增,预测未来六年将以7.8%的CAGR稳健增长
  • 赋值的2个方式
  • 汉中市英语雅思培训机构推荐|2026权威测评出国雅思辅导机构口碑榜单 - 老周说教育
  • 从1934.6亿元到2903.6亿元,制药数据管理软件市场规模增长可期
  • OAuth2.0 和 RESTful 的核心区别
  • 2026年 环境试验设备厂家推荐排行榜:温湿度/高低温/盐雾/氙灯老化/步入式/新能源电池及储能试验箱专业品牌深度解析 - 品牌企业推荐师(官方)
  • 2026年重庆地区热门冷藏车品牌制造商推荐,哪家性价比高 - myqiye
  • 盘点2026年口碑好的综合型品牌营销顾问,品牌营销顾问服务选哪家 - mypinpai
  • Leetcode—206. 反转链表【简单】
  • 拖延症福音!MBA专属降AI工具 —— 千笔·降AI率助手
  • 2026年沧州值得选的打印机租赁公司探讨,知名的有谁? - 工业品牌热点
  • 2026年毫克秤按需定制、来样定制厂家排名,看看哪家性价比高 - 工业品网
  • 抛光液流量测量新选择:2026年优选超声波流量传感器品牌推荐 - 品牌2025
  • QGIS应用教学——降雨量的空间插值与等值线绘制
  • 荣顺天然海沙批发怎么样,选购海沙必看的行业分析 - myqiye
  • Windows #x2B; AMD 显卡,终于能用 PyTorch 炼丹了
  • Rust大学习-1:初识Rust与猜数游戏
  • Windows + AMD 显卡,终于能用 PyTorch 炼丹了
  • 选GEO优化服务公司,新纪元智能网络品牌实力和口碑怎么样 - mypinpai
  • SCI制图——Origin核心功能:非线性曲线拟合
  • 2025_NIPS_Boosting Resilience of Large Language Models through Causality-Driven Robust Optimization
  • 2026年天津实力强、口碑好的打印机租赁品牌企业推荐与选购指南 - 工业品牌热点
  • 室外空气质量监测站深度剖析:优质生产厂、推荐品牌与可靠安装方案 - 品牌推荐大师
  • 2026年电机微控制器MCU哪家好?五大主流品牌深度解析
  • 2026东南亚(越南、印度尼西亚、马来西亚、新加坡)出海用工无忧:优质名义雇主(EOR)服务商推荐 - 品牌2025
  • 汉中市英语雅思培训机构推荐; 2026权威测评出国雅思辅导机构口碑榜单 - 老周说教育
  • YYC齿轮采购全攻略:精度适配、Top5厂家精选与售后保障解析 - 深度智识库
  • Hadoop 社区