首页 > 其他分享 >AT_joisc2018_b 题解

AT_joisc2018_b 题解

时间:2024-01-11 15:59:20浏览次数:25  
标签:正方形 题解 线段 joisc2018 射线 我们

AT_joisc2018_b 题解

传送门

题意

有一个以原点为中心的正方形,有 \(n(n\le 100)\) 条不在正方形内部的线段,你需要画一些不在正方形内部的线段,使得这些线段可以把正方形围起来,要求最小化你画的线段的长度和。

思路

我们需要画出一条闭合折线,并且能够把正方形包围。

考虑我们一定是把已有线段用新的线段连起来,或者是让已有线段和正方形边界连起来。因为线段不能在正方形内,我们把两个线段连接起来如果要用正方形边界,就一定会覆盖一个拐角,就是说一定不会只用正方形一条边界的一部分,因此我们可以把只把正方形的四个角当成线段,这样我们就只需要考虑连接两个线段的贡献了。

对于每一对线段,我们求出连接这两个线段最小的代价和这条线段。注意如果这条线段和正方形有交,我们就不能选这条线段,而且我们用其他方式直接连接这两个线段一定没有通过正方形边界更优,因此不用考虑。现在问题就变成了找最小的环使得包含这个正方形。

对于判包含,我们可以从正方形中引出一条射线,如果这条射线经过了折线奇数次,就说明被包含了正方形。

于是对于每一对线段,我们求出连接这两个点的线段经过了射线多少次,这样我们的问题就是求一个经过射线次数为奇数的最小环,可以用 Floyd 解决。

复杂度 \(O(n^3)\)。

标签:正方形,题解,线段,joisc2018,射线,我们
From: https://www.cnblogs.com/Xttttr/p/17958728

相关文章

  • 1.11模拟赛 T2题解
    简要题意每个点有一定概率向前面的点连边,求两点之间距离的期望思路推柿子code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN1000005intn,m,u,v;constintmod=1e9+7;inta[N],sum[N],c[N],dep[N],s[N],f[N],g[N],h[N];intksm(intx......
  • P4103 [HEOI2014] 大工程 题解
    题目链接:大工程先考虑只有一次查询,很显然我们可以暴力树上dp处理出答案。对于每个节点而言,有:容易看出类似点分治逐个遍历子树计算前面一堆子树对后面子树的贡献思想,我们可以很容易的知道:对于路径总和,显然多了一段新的贡献,这段贡献为当前关键点和前面点多的一段\(2\)号路......
  • 《算法竞赛》题解---三分
    三分法模板三分法#include<bits/stdc++.h>#defineeps1e-8//或者constdoubleeps=1e-8;--主要是doubleusingnamespacestd;intn;doublea[15],l,r;doublecheck(doublex){ doubleans=0; for(inti=n;i>=0;i--) ans=ans*x+a[i];//秦九韶公式 returnans;}......
  • P4093 [HEOI2016/TJOI2016] 序列 题解
    题目链接:序列对于LIS问题,很显而易见的有dp方程为:\[dp_i=\max{dp_j}+1\(j<i,a_j\lea_i)\text{dp表示以某个位置结尾的最长LIS}\]本题考虑到对于转移的两位置,如果能从\(j\rightarrowi\),那么在以上条件成立的基础情况下,我们由于可以更改二者中的任意一个值(因为同一......
  • 2023 百度之星决赛题解
    T4传信游戏建反向边,从入度为\(0\)的结点开始搜T5喵喵卫士,全靠你了\(\star\)考虑暴力枚举每个点的深度,发现只要知道相邻两层的深度就能用组合数算方案数,自然想到按层DP,把上一层的点数记到状态里赛时做法按深度从小到大DP的话想要记录每个点是否被用过,以保证深度达到上......
  • P3203 弹飞绵羊 题解
    QuestionP3203[HNOI2010]弹飞绵羊一条直线上摆着\(n\)个弹簧,每个弹簧有一个弹力系数\(k_i\),当绵羊走到第\(i\)个弹簧时,会被弹到第\(i+k_i\)个弹簧,如果\(i+k_i>n\)则会被弹飞,有两个操作1x查询\(x\)处的绵羊经过几次会被弹飞2xy把\(x\)处的弹力系数改成......
  • P1307题解
    思路1.定义及输入原数/反转后的数intn,cnt=0;//反转后的数一定要归零!cin>>n;2.用while循环反转while(n!=0){//只要n还没有被分解完,就继续分解cnt=cnt*10+n%10;//cnt每次*10再加上分离出的数位(*10为了防0)n/=10;//n减一位}3.输出cout<<cnt;至此,这道题就做完......
  • P5722题解
    说两句哈,等差数列求和公式是\((A_1+A_n)\timesd\over2\),所以其实可以一行代码解决,但是我没高斯聪明,于是我不打算用等差数列求和公式。//(等差数列求和公式)intn;cin>>n;cout<<(1+n)*1/2;思路1.定义及输入截止的数/计数器intn,cnt=0;//计数器必须归零!cin>>n;2.循环......
  • P1085题解
    思路1.定义校内时间/校外时间/最大值(记录不高兴值)/记录星期intn,m,maxx=-1,tmp;2.使用循环输入并判断for(inti=1;i<=7;i++){//循环一周的日期cin>>n>>m;if(n+m>8&&maxx<n+m){//如果津津不高兴了且它比以往的值都大maxx=n+m;//更改最大值tmp=i;......
  • P5718题解
    思路1.定义及输入最小值的变量/输入个数/每个数intn,m,minn=1001;cin>>n;2.循环输入每个数并找最小值while(n--){cin>>m;minn=min(minn,m);}(用for循环也可以)for(inti=1;i<=n;i++){cin>>m;minn=min(minn,m);}3.输出cout<<minn;至此,这道题就做......