题意:

给定一个 nnn 个点的凸包,再给出 mmm 个光照点,每个光照点的照射范围为 360360360 度,问最少选取几个光照点可以照亮整个凸包,要求输出方案,保证不会出现一个光照点位于凸包的延长线上,共 200200200 组数据。(1≤n,m≤1000)(1\leq n,m\leq 1000)(1≤n,m≤1000)


思路:

其实这题思路比较明显,就是先求出每个光照点所能照射到的一段连续范围,然后问题就变成了给定一个长度为 nnn 的环形区域,以及 mmm 段区间,要求选取最少的区间覆盖整个区域。

首先求每个光照点对应的一段连续区域,比赛时的思路是极角排序,然后选择最两边的边。这样的复杂度是 O(n2logn)O(n^2logn)O(n2logn),再加上 200200200 组数据,成功 TLETLETLE…其实仔细思考一下可以发现并不需要进行极角排序,利用叉积即可解决该问题。因为照射范围的两个端点一定是光照点与凸包点连线形成的直线中最两边的两个点。

因此其它所有端点与光照点连线形成的直线都是顺时针或逆时针才能到达两个端点,即照射范围的两个端点是顺时针旋转的两个边界点,因此直接用叉积判断即可。

for(int i = 0; i <= m-1; i++){L[i] = 0, R[i] = 0;rep(int j = 1; j <= n-1; j++){//利用叉积求切线if((P[L[i]]-H[i]).det(P[j]-H[i]) > 0) L[i] = j;if((P[R[i]]-H[i]).det(P[j]-H[i]) < 0) R[i] = j;}
}

求出每个光照点范围之后,就只需要处理区间覆盖问题了。环形区域,我们只需要枚举起始点,O(n2)O(n^2)O(n2) 求解即可。我们记录 add[i]add[i]add[i] 数组表示所有覆盖第 iii 条的光照点中所能覆盖的最远距离,id[i]id[i]id[i] 记录光照点编号,然后直接贪心即可解决该问题。


总结:

计算几何的绝大多数问题,都可以用叉积和点积进行解决,因为叉积和点积已经覆盖了两条直线所能出现的所有组合情况。

因此今后的计算几何问题,一定要首选用叉积和点积进行解决。


代码:

#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof a);
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define per(i,a,b) for(int i = a; i >= b; i--)
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
typedef long long ll;
typedef double db;
#define pi acos(-1.0)
const int N = 1e3+100;
const db EPS = 1e-9;
using namespace std;void dbg() {cout << "\n";}
template<typename T, typename... A> void dbg(T a, A... x) {cout << a << ' '; dbg(x...);}
#define logs(x...) {cout << #x << " -> "; dbg(x);}
inline int sign(db a) {return a < -EPS ? -1 : a > EPS;}
inline int cmp(db a,db b) {return sign(a-b);}struct Point{ll x,y;Point operator-(Point p) {return {x-p.x,y-p.y};}ll dot(Point p) {return x*p.x+y*p.y;}ll det(Point p) {return x*p.y-y*p.x;} //叉积
}P[N],H[N];int n,m,L[N],R[N],add[N],id[N],ans;
vector<int> base;void init(){scanf("%d%d",&n,&m);rep(i,0,n-1) scanf("%lld%lld",&P[i].x,&P[i].y);rep(i,0,m-1) scanf("%lld%lld",&H[i].x,&H[i].y);rep(i,0,n-1) add[i] = id[i] = 0;rep(i,0,m-1){L[i] = 0, R[i] = 0;rep(j,1,n-1){//利用叉积求切线if((P[L[i]]-H[i]).det(P[j]-H[i]) > 0) L[i] = j;if((P[R[i]]-H[i]).det(P[j]-H[i]) < 0) R[i] = j;}int len = (R[i]-L[i]+n)%n;rep(j,0,len-1){int now = (L[i]+j)%n;int tlen = (R[i]-now+n)%n;if(tlen > add[now]) add[now] = tlen, id[now] = i;}}
}void solve(){ans = 1e5; base.clear();rep(i,0,n-1){int pos = i, num = 0, left = n;vector<int> hp; hp.clear();while(left > 0){if(add[pos] == 0) {num = 1e5; break;}left -= add[pos];hp.push_back(id[pos]);pos = (pos+add[pos])%n;num++;}if(num < ans){ans = num;base = hp;}}if(ans == 1e5) printf("-1\n");else{printf("%d\n",ans);rep(i,0,ans-1) printf("%d%c",base[i]+1," \n"[i==ans-1]);}
}int main()
{int _; scanf("%d",&_);while(_--){init();solve();}return 0;
}

【2018徐州ICPC Gym-102012 M】Rikka with Illuminations【计算几何】相关推荐

  1. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 Features Track(STL二维map)

    Morgana is learning computer vision, and he likes cats, too. One day he wants to find the cat moveme ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 D. Easy Math

    Easy Math 问答问题反馈 只看题面 16.47% 1000ms 262144K Given a positive integers nn , Mobius function \mu(n)μ(n ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath

    ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath 做法: \[f(m,n) = \sum _{i=1}^{m} \mu(in) = \sum_{i=1}^{m}[gcd(i,n)= ...

  5. ACM-ICPC 2018 徐州赛区网络预赛G (单调队列)

    传送门 题面: There's a beach in the first quadrant. And from time to time, there are sea waves. A wave (  ...

  6. 2018焦作ICPC E - Resistors in Parallel(规律+Java大数)

    2018焦作ICPC E - Resistors in Parallel题目链接 Time limit  2000 ms Memory limit  1048576 kB In this physic ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 - A. Hard to prepare - (计数递归)

    题目链接 After Incident, a feast is usually held in Hakurei Shrine. This time Reimu asked Kokoro to deli ...

  8. [2018 徐州 网络赛|Hard to prepare ] 环形染色问题的公式解法

    题目来源 After Incident, a feast is usually held in Hakurei Shrine. This time Reimu asked Kokoro to deli ...

  9. gym/101955/problem/E - The Kouga Ninja Scrolls 线段数 维护 切比雪夫距离 2018沈阳icpc

    传送门 思路: 这道题要把给定的每个坐标利用切比雪夫坐标表示,这样两个点的距离就是max(dx,dy),而不是一开始的dx + dy,有利于线段树的维护,又由于询问的是区间的最大差值,限制是两个点是属 ...

  10. 2018徐州 Gym - 102028J Carpets Removal 概率事件+二维差分

    题目链接:https://vjudge.net/problem/Gym-102028J 题意:去掉两个矩形,让剩下的矩形覆盖的点最少 题解:使剩下的点少,那么我们就是去掉的两个矩形覆盖的尽可能多,也就 ...

最新文章

  1. 文件资源管理右键卡死无响应
  2. maven开发mybatis 让*.xml 拷贝到classes目录下
  3. 一个网页菜单的CSS代码分析
  4. export default 和 export 区别(ES6)
  5. 生命游戏(Game of Life)描述
  6. [19/04/07-星期日] 多线程_线程的状态(新生、就绪、运行、死亡)
  7. 理解进程调度时机跟踪分析进程调度与进程切换的过程
  8. python处理csv文件案例_让繁琐的工作自动化——python处理CSV文件
  9. Dotnet 6.0 深度探索(一)
  10. Thymeleaf 简介、教程
  11. .NET Remoting Security使用小结 – TcpChannel
  12. 关于Java 8 forEach
  13. 【OpenCV应用】python处理行李图像匹配项目——图像特征点
  14. BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)
  15. python函数速查手册_Pandas常用函数速查手册中文版
  16. NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 都是些什么鸟玩意?
  17. 微信分享出错问题,MicroMsg.SDK.WXMediaMessage: checkArgs fail, thumbData is invalid
  18. 万字长文:AWS如何跨越“鸿沟”
  19. 余华:从手握钢钳的牙医到名满世界的作家
  20. 苹果6解锁ID锁支持ios13以下所有系统

热门文章

  1. 如何管理好IDC机房?(二) ----依靠技术还是管理
  2. whey some page need header when your fetch that page and some don't need
  3. wordpress不登陆后台禁用插件
  4. vue+element+node构建单片机控制系统
  5. 关于python编程语法_Python编程入门——基础语法详解
  6. OpenCV-图像处理- Java(读取与显示图片)
  7. 华硕主板如何设置开机自启_华硕主板自动开机的设置方法.doc
  8. java 解析 xml中的冒号_Java jdom解析xml文件带冒号的属性
  9. wordpress 修改上传文件大小限制
  10. 2万字-Python 用 XGBoost 进行梯度提升的数据准备(建议收藏)