计算几何 半平面交

LA 4992 && hdu 3761 Jungle Outpost

杭电的有点坑啊。。一直爆内存,后来发现大白的半平面交模板那里 point *p = new point[n]; line *q = new line[n]这里出了问题,应该是在函数里面申请不了比较大的数组,所以爆内存。。我在全局定义了两个数组就不会爆了。。

本来跑了17s多的,后来半平面交sort( l, l + n ) 被我注释了,就跑了9s多,LA上跑了 2s。。应该是输入数据比较好,不用按照极角排序。。然后就是照着大白的想法,二分答案,用半平面交判断是否满足条件。。

输入是按照逆时针输入的,所以用p[i] - p[(i+m+1)%n]表示直线的向量。。

这道题被坑了好久,好伤心。。贴的是在杭电ac的代码

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<string>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<cmath>
  8 #include<vector>
  9 
 10 using namespace std;
 11 
 12 #define mnx 50050
 13 #define LL long long
 14 #define mod 1000000007
 15 #define inf 0x3f3f3f3f
 16 #define eps 1e-8
 17 #define Pi acos(-1.0);
 18 #define lson l, m, rt << 1
 19 #define rson m+1, r, rt << 1 | 1
 20 
 21 int dcmp( double x ){
 22     if( fabs( x ) < eps ) return 0;
 23     return x < 0 ? -1 : 1;
 24 }
 25 struct point{
 26     double x, y;
 27     point( double x = 0, double y = 0 ) : x(x), y(y) {}
 28     point operator + ( const point &b ) const{
 29         return point( x + b.x, y + b.y );
 30     }
 31     point operator - ( const point &b ) const{
 32         return point( x - b.x, y - b.y );
 33     }
 34     point operator * ( const double &k ) const{
 35         return point( x * k, y * k );
 36     }
 37     point operator / ( const double &k ) const{
 38         return point( x / k, y / k );
 39     }
 40     bool operator < ( const point &b ) const{
 41         return dcmp( x - b.x ) < 0 || dcmp( x - b.x ) == 0 && dcmp( y - b.y ) < 0;
 42     }
 43     bool operator == ( const point &b ) const{
 44         return dcmp( x - b.x ) == 0 && dcmp( y - b.y ) == 0;
 45     }
 46     double len(){
 47         return sqrt( x * x + y * y );
 48     }
 49 };
 50 typedef point Vector;
 51 struct line{
 52     point p; 
 53     Vector v;
 54     double ang;
 55     line() {}
 56     line( point p, point v ) : p(p), v(v) {
 57         ang = atan2( v.y, v.x );
 58     }
 59     bool operator < ( const line &b ) const{
 60         return ang < b.ang;
 61     }
 62 };
 63 double dot( Vector a, Vector b ){
 64     return a.x * b.x + a.y * b.y;
 65 }
 66 double cross( Vector a, Vector b ){
 67     return a.x * b.y - a.y * b.x;
 68 }
 69 bool onleft( line l, point p ){
 70     return cross( l.v, p - l.p ) > 0;
 71 }
 72 point getintersection( line a, line b ){
 73     Vector u = a.p - b.p;
 74     double t = cross( b.v, u ) / cross( a.v, b.v );
 75     return a.p + a.v * t;
 76 }
 77 point pp[mnx];
 78 line q[mnx];
 79 int halfplaneintersection( line *L, int n, point *poly ){
 80     //sort( L, L + n );
 81     int first, last;
 82     q[first = last = 0] = L[0];
 83     for( int i = 1; i < n; i++ ){
 84         while( first < last && !onleft( L[i], pp[last-1] ) ) last--;
 85         while( first < last && !onleft( L[i], pp[first] ) ) first++;
 86         q[++last] = L[i];
 87         if( fabs( cross( q[last].v, q[last-1].v ) ) < eps ){
 88             last--;
 89             if( onleft( q[last], L[i].p ) ) q[last] = L[i];
 90         }
 91         if( first < last ) pp[last-1] = getintersection( q[last-1], q[last] );
 92     }
 93     while( first < last && !onleft( q[first], pp[last-1] ) ) last--;
 94     if( last - first <= 1 ) return 0;
 95     pp[last] = getintersection( q[last], q[first] );
 96     int m = 0;
 97     for( int i = first; i <= last; i++ ){
 98         poly[m++] = pp[i];
 99     }
100     return m;
101 }
102 point p[mnx], poly[mnx];
103 line l[mnx];
104 bool check( int n, int m ){
105     if( n - m <= 2 ) return 1;
106     for( int i = 0; i < n; i++ ){
107         l[i] = line( p[i], p[i] - p[(i+m+1)%n] );
108     }
109     int all = halfplaneintersection( l, n, poly );
110     if( !all ) return 1;
111     else return 0;
112 }
113 int main(){
114     int n, cas;
115     scanf( "%d", &cas );
116     while( cas-- ){
117         scanf( "%d", &n );
118         for( int i = 0; i < n; i++ ){
119             scanf( "%lf %lf", &p[i].x, &p[i].y );
120         }
121         if( n > 50000 ) continue;
122         int l = 0, r = n, ans;
123         while( l < r ){
124             int m = ( l + r ) >> 1;
125             if( check( n, m ) == 1 ){
126                 ans = m, r = m;
127             }
128             else l = m + 1;
129         }
130         printf( "%d\n", ans );
131     }
132     return 0;
133 }
View Code

 

转载于:https://www.cnblogs.com/LJ-blog/p/3960924.html

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

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

相关文章

Maven 强制导入jar包

场景 有时候因为各种原因(依赖有了&#xff0c;jar包有了)&#xff0c;项目中就是没有这个jar包。 在需要强导的项目中创建lib文件夹&#xff0c;将需要强导的jar包访问lib中。添加依赖$&#xff5b;pom.basedir&#xff5d;:获取当前所在的项目目录 $&#xff5b;pom.basedir&…

《Java 高并发》03 线程的生命周期

相关概念 进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。 一个进程是一个独立的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含…

Spring boot 整合dynamic实现多数据源

项目git地址&#xff1a;Jacob-dynamic 准备工作 # 创建数据库db1 CREATE DATABASE db1CHARACTER SET utf8 COLLATE utf8_bin # 创建user表 CREATE TABLE user (id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 # 添加数据 INSERT…

Could not autowire. No beans of 'JavaMailSender' type found..md

Could not autowire. No beans of JavaMailSender type found. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.1.5.RELEASE</version> </depe…

极客Web前端开发资源集锦

本周我们带来的前端推荐包含当前热门的bootstrap&#xff0c;html5&#xff0c;css3等技术内容和新闻话题&#xff0c;如果你还想近一步学习如何开发&#xff0c;还可以关注我们的极客课程库&#xff0c;里面涵盖了现代开发技术的‘学’与‘习’的全新功能。希望对大家有所帮助…

使用 Spring Cloud 实现微服务系统

使用 Spring Cloud 实现微服务系统 准备工作&#xff1a;为了方便创建项目&#xff0c;以及各版本以来关系&#xff0c;此次创建项目使用 Spring Assistant插件。 创建单体服务中心项目 启用服务端的服务注册&#xff0c;发现功能 EnableEurekaServer SpringBootApplication pu…

android 小工具:pc 上用 curl 命令打开手机浏览器,浏览指定网址

测试 API 时或其它情况经常需要在手机浏览器中输入 url 一长串的 url 输起来真是麻烦 AirDroid 很强大也不用数据线&#xff0c;但有时老断开连接&#xff0c;不是很爽。发到手机 qq 吧还得手动粘贴 所以自己开发了一个小工具 pc 上用 curl 发一条命令&#xff0c;命令中输入要…

iOS: How To Make AutoLayout Work On A ScrollView

转载自&#xff1a; http://natashatherobot.com/ios-autolayout-scrollview/ Posted on June 11th, 2014 Ok, I’ll admit. I’ve been seriously struggling with AutoLayout ever since it’s been introduced. I understand the concept, and I LOVE the idea of it, but w…

windows 中搭建Zookeeper的搭建

个人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思远Y 下载 下载地址&#xff1a; https://mirrors.cnnic.cn/apache/zookeeper/ PS&#xff1a;zookeeper 从3.5.5以后的版本带有bin标识的包&#xff0c;否…

Vs Code:Remote SSH

Remote SSH 简介 Remote - SSH 扩展允许您使用任何带有 SSH 服务器的远程计算机作为开发环境。由于几乎每个桌面和服务器操作系统都有可配置的 SSH 服务器&#xff0c;因此该扩展可以在各种情况下大大简化开发。 您可以&#xff1a; 在部署的同一操作系统上进行开发&#xff…

样条之贝塞尔(Bezier)

我曾经发过两篇关于贝塞尔的文章&#xff1a;数学图形(1.47)贝塞尔(Bzier)曲线&#xff0c;数学图形之贝塞尔(Bzier)曲面。那是使用我自己定义的脚本语言生成贝塞尔图形。由于我自己定义的脚本语法功能有限&#xff0c;所以最多只能支持5次贝塞尔函数&#xff0c;而这里将实现N…

设计模式 之 工厂模式

项目源码&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 个人博客&#xff1a;https://jacob.org.cn 女娲造人的故事 东汉《风俗通》记录了一则神话故事&#xff1a;“开天辟地&#xff0c;未有人民&#xff0c;女娲搏黄土做人”&#xff0c;讲述的内容就是大家非常熟…

设计模式 之 单例模式

项目源码&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 个人博客&#xff1a;https://jacob.org.cn 宗旨 Ensure a class has only one instance,and provide a global point of access to it.&#xff08;确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个…

设计模式 之 抽象工厂模式

项目源码&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 个人博客 &#xff1a;https://jacob.org.cn 女娲的失误 工厂模式中讲了女娲造人的故事。人是造出来了&#xff0c;世界也热闹了&#xff0c;可是低头一看&#xff0c;都是清一色的类型&#xff0c;缺少关爱、仇…

设计模式 之 模板模式

项目源码&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 个人博客 &#xff1a;http://jacob.org.cn 女娲的失误 工厂模式中讲了女娲造人的故事。人是造出来了&#xff0c;世界也热闹了&#xff0c;可是低头一看&#xff0c;都是清一色的类型&#xff0c;缺少关爱、仇…

使用Java高速实现进度条

基于有人问到如何做进度条&#xff0c;以下给个简单的做法&#xff1a; 主要是使用JProgressBar&#xff08;Swing内置javax.swing.JProgressBar&#xff09;和SwingWorker&#xff08;Swing内置javax.swing.SwingWorker&#xff09; 有人肯定会说&#xff0c;不是用线程做的吗…

关于js的function.来自百度知道的回答,学习了.

在js中&#xff0c;创建一个函数对象的语法是var myFunction new Function(arg1,…,agrN, body);其中&#xff0c;该函数对象的N个参数放在 函数主体参数body的前面&#xff0c;即函数主体参数必须放在参数列表的最后&#xff0c;也可以无参数new Function(body)。你添加第三个…

fedora20开机启动配置:systemctl

老版fedora中使用chkconfig配置开机启动&#xff0c;fedora20中&#xff0c;使用chkconfig会出现各种问题。使用systemctl配置。 具体表格如下 转载于:https://www.cnblogs.com/hh6plus/p/5548083.html

《Java 高并发》01 高并发基本概念

基本概念 同步和异步 同步和异步通常是用来形容一次方法调用。 同步方法调用一旦开始&#xff0c;调用者必须等到方法返回才能继续执行后续操作。 异步方法调用更像一个消息传递&#xff0c;一旦开始&#xff0c;方法调用就会立即返回&#xff0c;调用者就可以继续后续的操…

Android之Http网络编程(四)

前面几篇博文简单的介绍了一些常见的Http的操作&#xff0c;这些操作几乎都是在新开的线程中进行的网络请求&#xff0c;并在日志中打印出获取到的网络数据。那么&#xff0c;问题来了&#xff01;&#xff08;呃~感觉下一句是蓝翔有木有&#xff1f;&#xff09;如何在把获取到…