poj3335 半平面交

題意:給出一多邊形。判斷多邊形是否存在一點,使得多邊形邊界上的所有點都能看見該點。

?

sol:在紙上隨手畫畫就可以找出規律:按逆時針順序連接所有點。然后找出這些line的半平面交。

題中給出的點已經按順時針排好序了,所以只要倒過來一下就可以了。很簡單的模板題。

?

  1 #include<vector>
  2 #include<list>
  3 #include<map>
  4 #include<set>
  5 #include<deque>
  6 #include<queue>
  7 #include<stack>
  8 #include<bitset>
  9 #include<algorithm>
 10 #include<functional>
 11 #include<numeric>
 12 #include<utility>
 13 #include<iostream>
 14 #include<sstream>
 15 #include<iomanip>
 16 #include<cstdio>
 17 #include<cmath>
 18 #include<cstdlib>
 19 #include<cctype>
 20 #include<string>
 21 #include<cstring>
 22 #include<cstdio>
 23 #include<cmath>
 24 #include<cstdlib>
 25 #include<ctime>
 26 #include<climits>
 27 #include<complex>
 28 #define mp make_pair
 29 #define pb push_back
 30 using namespace std;
 31 const double eps=1e-6;
 32 const double pi=acos(-1.0);
 33 const double inf=1e20;
 34 const int maxp=1111;
 35 int dblcmp(double d)
 36 {
 37     if (fabs(d)<eps)return 0;
 38     return d>eps?1:-1;
 39 }
 40 inline double sqr(double x){return x*x;}
 41 struct point
 42 {
 43     double x,y;
 44     point(){}
 45     point(double _x,double _y):
 46     x(_x),y(_y){};
 47     void input()
 48     {
 49         scanf("%lf%lf",&x,&y);
 50     }
 51     void output()
 52     {
 53         printf("%.2f %.2f\n",x,y);
 54     }
 55     bool operator==(point a)const
 56     {
 57         return dblcmp(a.x-x)==0&&dblcmp(a.y-y)==0;
 58     }
 59     bool operator<(point a)const
 60     {
 61         return dblcmp(a.x-x)==0?dblcmp(y-a.y)<0:x<a.x;
 62     }
 63     double len()
 64     {
 65         return hypot(x,y);
 66     }
 67     double len2()
 68     {
 69         return x*x+y*y;
 70     }
 71     double distance(point p)
 72     {
 73         return hypot(x-p.x,y-p.y);
 74     }
 75     point add(point p)
 76     {
 77         return point(x+p.x,y+p.y);
 78     }
 79     point sub(point p)
 80     {
 81         return point(x-p.x,y-p.y);
 82     }
 83     point mul(double b)
 84     {
 85         return point(x*b,y*b);
 86     }
 87     point div(double b)
 88     {
 89         return point(x/b,y/b);
 90     }
 91     double dot(point p)
 92     {
 93         return x*p.x+y*p.y;
 94     }
 95     double det(point p)
 96     {
 97         return x*p.y-y*p.x;
 98     }
 99     double rad(point a,point b)
100     {
101         point p=*this;
102         return fabs(atan2(fabs(a.sub(p).det(b.sub(p))),a.sub(p).dot(b.sub(p))));
103     }
104     point trunc(double r)
105     {
106         double l=len();
107         if (!dblcmp(l))return *this;
108         r/=l;
109         return point(x*r,y*r);
110     }
111     point rotleft()
112     {
113         return point(-y,x);
114     }
115     point rotright()
116     {
117         return point(y,-x);
118     }
119     point rotate(point p,double angle)//繞點p逆時針旋轉angle角度
120     {
121         point v=this->sub(p);
122         double c=cos(angle),s=sin(angle);
123         return point(p.x+v.x*c-v.y*s,p.y+v.x*s+v.y*c);
124     }
125 };
126 struct line
127 {
128     point a,b;
129     line(){}
130     line(point _a,point _b)
131     {
132         a=_a;
133         b=_b;
134     }
135     bool operator==(line v)
136     {
137         return (a==v.a)&&(b==v.b);
138     }
139     //傾斜角angle
140     line(point p,double angle)
141     {
142         a=p;
143         if (dblcmp(angle-pi/2)==0)
144         {
145             b=a.add(point(0,1));
146         }
147         else
148         {
149             b=a.add(point(1,tan(angle)));
150         }
151     }
152     //ax+by+c=0
153     line(double _a,double _b,double _c)
154     {
155         if (dblcmp(_a)==0)
156         {
157             a=point(0,-_c/_b);
158             b=point(1,-_c/_b);
159         }
160         else if (dblcmp(_b)==0)
161         {
162             a=point(-_c/_a,0);
163             b=point(-_c/_a,1);
164         }
165         else
166         {
167             a=point(0,-_c/_b);
168             b=point(1,(-_c-_a)/_b);
169         }
170     }
171     void input()
172     {
173         a.input();
174         b.input();
175     }
176     void adjust()
177     {
178         if (b<a)swap(a,b);
179     }
180     double length()
181     {
182         return a.distance(b);
183     }
184     double angle()//直線傾斜角 0<=angle<180
185     {
186         double k=atan2(b.y-a.y,b.x-a.x);
187         if (dblcmp(k)<0)k+=pi;
188         if (dblcmp(k-pi)==0)k-=pi;
189         return k;
190     }
191     //點和線段關系
192     //1 在逆時針
193     //2 在順時針
194     //3 平行
195     int relation(point p)
196     {
197         int c=dblcmp(p.sub(a).det(b.sub(a)));
198         if (c<0)return 1;
199         if (c>0)return 2;
200         return 3;
201     }
202     bool pointonseg(point p)
203     {
204         return dblcmp(p.sub(a).det(b.sub(a)))==0&&dblcmp(p.sub(a).dot(p.sub(b)))<=0;
205     }
206     bool parallel(line v)
207     {
208         return dblcmp(b.sub(a).det(v.b.sub(v.a)))==0;
209     }
210     //2 規范相交
211     //1 非規范相交
212     //0 不相交
213     int segcrossseg(line v)
214     {
215         int d1=dblcmp(b.sub(a).det(v.a.sub(a)));
216         int d2=dblcmp(b.sub(a).det(v.b.sub(a)));
217         int d3=dblcmp(v.b.sub(v.a).det(a.sub(v.a)));
218         int d4=dblcmp(v.b.sub(v.a).det(b.sub(v.a)));
219         if ((d1^d2)==-2&&(d3^d4)==-2)return 2;
220         return (d1==0&&dblcmp(v.a.sub(a).dot(v.a.sub(b)))<=0||
221                 d2==0&&dblcmp(v.b.sub(a).dot(v.b.sub(b)))<=0||
222                 d3==0&&dblcmp(a.sub(v.a).dot(a.sub(v.b)))<=0||
223                 d4==0&&dblcmp(b.sub(v.a).dot(b.sub(v.b)))<=0);
224     }
225     int linecrossseg(line v)//*this seg v line
226     {
227         int d1=dblcmp(b.sub(a).det(v.a.sub(a)));
228         int d2=dblcmp(b.sub(a).det(v.b.sub(a)));
229         if ((d1^d2)==-2)return 2;
230         return (d1==0||d2==0);
231     }
232     //0 平行
233     //1 重合
234     //2 相交
235     int linecrossline(line v)
236     {
237         if ((*this).parallel(v))
238         {
239             return v.relation(a)==3;
240         }
241         return 2;
242     }
243     point crosspoint(line v)
244     {
245         double a1=v.b.sub(v.a).det(a.sub(v.a));
246         double a2=v.b.sub(v.a).det(b.sub(v.a));
247         return point((a.x*a2-b.x*a1)/(a2-a1),(a.y*a2-b.y*a1)/(a2-a1));
248     }
249     double dispointtoline(point p)
250     {
251         return fabs(p.sub(a).det(b.sub(a)))/length();
252     }
253     double dispointtoseg(point p)
254     {
255         if (dblcmp(p.sub(b).dot(a.sub(b)))<0||dblcmp(p.sub(a).dot(b.sub(a)))<0)
256         {
257             return min(p.distance(a),p.distance(b));
258         }
259         return dispointtoline(p);
260     }
261     point lineprog(point p)
262     {
263         return a.add(b.sub(a).mul(b.sub(a).dot(p.sub(a))/b.sub(a).len2()));
264     }
265     point symmetrypoint(point p)
266     {
267         point q=lineprog(p);
268         return point(2*q.x-p.x,2*q.y-p.y);
269     }
270 };
271 
272 struct Vector:public point
273 {
274     Vector(){}
275     Vector(double a,double b)
276     {
277         x=a;    y=b;
278     }
279     Vector(point _a,point _b)   //a->b
280     {
281         double dx=_b.x-_a.x;
282         double dy=_b.y-_a.y;
283         x=dx;   y=dy;
284     }
285     Vector(line v)
286     {
287         double dx=v.b.x-v.a.x;
288         double dy=v.b.y-v.a.y;
289         x=dx;   y=dy;
290     }
291     double length()
292     {
293         return (sqrt(x*x+y*y));
294     }
295     Vector Normal()
296     {
297         double L=sqrt(x*x+y*y);
298         Vector Vans=Vector(-y/L,x/L);
299         return Vans;
300     }
301 };
302 
303 struct halfplane:public line    //半平面
304 {
305     double angle;
306     halfplane(){}
307     //表示向量 a->b逆時針(左側)的半平面
308     halfplane(point _a,point _b)
309     {
310         a=_a;
311         b=_b;
312     }
313     halfplane(line v)
314     {
315         a=v.a;
316         b=v.b;
317     }
318     void calcangle()
319     {
320         angle=atan2(b.y-a.y,b.x-a.x);
321     }
322     bool operator<(const halfplane &b)const
323     {
324         return angle<b.angle;
325     }
326 };
327 struct halfplanes   //半平面交
328 {
329     int n;
330     halfplane hp[maxp];
331     point p[maxp];
332     int que[maxp];
333     int st,ed;
334     void push(halfplane tmp)
335     {
336         hp[n++]=tmp;
337     }
338     void unique()
339     {
340         int m=1,i;
341         for (i=1;i<n;i++)
342         {
343             if (dblcmp(hp[i].angle-hp[i-1].angle))hp[m++]=hp[i];
344             else if (dblcmp(hp[m-1].b.sub(hp[m-1].a).det(hp[i].a.sub(hp[m-1].a))>0))hp[m-1]=hp[i];
345         }
346         n=m;
347     }
348     bool halfplaneinsert()
349     {
350         int i;
351         for (i=0;i<n;i++)hp[i].calcangle();
352         sort(hp,hp+n);
353         unique();
354         que[st=0]=0;
355         que[ed=1]=1;
356         p[1]=hp[0].crosspoint(hp[1]);
357         for (i=2;i<n;i++)
358         {
359             while (st<ed&&dblcmp((hp[i].b.sub(hp[i].a).det(p[ed].sub(hp[i].a))))<0)ed--;
360             while (st<ed&&dblcmp((hp[i].b.sub(hp[i].a).det(p[st+1].sub(hp[i].a))))<0)st++;
361             que[++ed]=i;
362             if (hp[i].parallel(hp[que[ed-1]]))return false;
363             p[ed]=hp[i].crosspoint(hp[que[ed-1]]);
364         }
365         while (st<ed&&dblcmp(hp[que[st]].b.sub(hp[que[st]].a).det(p[ed].sub(hp[que[st]].a)))<0)ed--;
366         while (st<ed&&dblcmp(hp[que[ed]].b.sub(hp[que[ed]].a).det(p[st+1].sub(hp[que[ed]].a)))<0)st++;
367         if (st+1>=ed)return false;
368         return true;
369     }
370     /*
371     void getconvex(polygon &con)
372     {
373         p[st]=hp[que[st]].crosspoint(hp[que[ed]]);
374         con.n=ed-st+1;
375         int j=st,i=0;
376         for (;j<=ed;i++,j++)
377         {
378             con.p[i]=p[j];
379         }
380     }*/
381 };
382 
383 point p[1000];
384 halfplanes TH;
385 int n,T;
386 
387 int main()
388 {
389     //freopen("in.txt","r",stdin);
390 
391     cin>>T;
392     while (T--)
393     {
394         cin>>n;
395         for (int i=n-1;i>=0;i--)
396             p[i].input();
397         //p[i]->p[i+1]
398 
399         TH.n=0;
400         for (int i=0;i<=n-1;i++)
401             TH.push(halfplane(p[i],p[(i+1)%n]));
402 
403         if (TH.halfplaneinsert())
404             cout<<"YES"<<endl;
405         else    cout<<"NO"<<endl;
406     }
407 
408     return 0;
409 }
View Code

?

轉載于:https://www.cnblogs.com/pdev/p/4277687.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376246.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php進程間通信 yoc_續上篇Swoole多進程數據共享的問題

原因進程作為程序執行過程中資源分配的基本單位&#xff0c;擁有獨立的地址空間,同一進程的線程可以共享本進程的全局變量&#xff0c;靜態變量等數據和地址空間&#xff0c;但進程之間資源相互獨立。由于PHP語言不支持多線程&#xff0c;因此Swoole使用多進程模式&#xff0c;…

JavaBean的規范

&#xff08;1&#xff09;JavaBean 類必須是一個公共類&#xff0c;并將其訪問屬性設置為 public &#xff08;2&#xff09;JavaBean 類必須有一個空的構造函數&#xff1a;類中必須有一個不帶參數的公用構造器&#xff0c;此構造器也應該通過調用各個特性的設置方法來設置特…

linux虛擬機ip修改無效

把一個centos虛擬機移動到另一臺電腦的時候&#xff0c;移動前是靜態ip&#xff0c;移動后發現虛擬機的ip不同了。 由于使用的是NAT&#xff0c;于是就修改了虛擬機的配置&#xff0c;發現虛擬機的ip仍然不是配置文件需要的情況。 可以嘗試命令nmcli con show&#xff0c;如果…

驗證(Verification)與確認(Validation)的差別

驗證(Verification)與確認&#xff08;Validation&#xff09;的差別 說法一&#xff1a; &#xff08;2&#xff09;“驗證(Verification)”的涵義 通過提供客觀證據對規定要求已得到滿足的認定。 &#xff08;2&#xff09;“確認&#xff08;Validation&#xff09;”的涵義…

vscode自動格式化不符合eslint_VsCode(Visual Studio Code)格式化代碼符合EsLint

利用Visual Studio Code ESlint插件&#xff0c;實現自動格式化代碼步驟一&#xff1a;安裝ESlint插件>點擊Extensions或者CtrlShiftX>搜索ESlint>install EsLint步驟二: 重啟VsCode&#xff0c; 發現代碼提示報錯&#xff0c;代碼不符合規范步驟三&#xff1a;鼠標ho…

解讀Google分布式鎖服務

背景介紹 在2010年4月&#xff0c;Google的網頁索引更新實現了實時更新&#xff0c;在今年的OSDI大會上&#xff0c;Google首次公布了有關這一技術的論文。 在此之前&#xff0c;Google的索引更新&#xff0c;采用的的批處理的方式(map/reduce)&#xff0c;也就是當增量數據達到…

使用PHPMailer郵件發不出去

遇到了PHPMailer發不出去郵件的問題&#xff0c;在執行smtpConnect()時失敗了&#xff0c;同樣的配置在其他環境就能發送郵件。 最后發現是dns沒有配置&#xff0c;解析不了郵箱服務器的域名&#xff0c;所以沒發出去。。。。 如果其他語言也遇到了這樣的情況&#xff0c;可以…

PHPcurl抓取AJAX異步內容(轉載)

PHPcurl抓取AJAX異步內容其實抓ajax異步內容的頁面和抓普通的頁面區別不大。ajax只不過是做了一次異步的http請求&#xff0c;只要使用firebug類似的工具&#xff0c;找到請求的后端服務url和傳值的參數&#xff0c;然后對該url傳遞參數進行抓取即可。 利用Firebug的網絡工具 …

做自適應網站專業樂云seo_自適應網站方案品牌樂云seo

自適應網站方案品牌樂云seo&#xff0c;做樂云seo網站推廣哪收錄比較穩定&#xff0c;下面小編從以下幾點詳細介紹一下自適應網站方案品牌樂云seo&#xff1a;一、樂云seo做核心關鍵詞首頁排名技術怎么樣&#xff1f;孔祥永seo做核心關鍵詞到首頁的秘訣就是做好原創內容&#x…

boost windows編譯

執行&#xff1a; &#xff08;1&#xff09;bootstrap.bat &#xff08;2&#xff09;b2 -j4 toolsetmsvc-9.0 linkstatic threadingmulti runtime-linkstatic address-model64 stage --stagedir“D:\Code\boost_1_66_0\lib” debug release toolset:msvc-9.0 使用vs2008編…

必應輸入法產品分析

2013年4月&#xff0c;微軟MSN(中國)宣布推出首款整合搜索體驗的中文云輸入法“必應Bing輸入法”&#xff0c;其前身是“英庫拼音輸入法(于2012年8月發布測試版)” 在此&#xff0c;Fruits小組從宏觀的軟件工程角度和微觀的產品實現細節對必應輸入法進行了考察和分析。 &#x…

這是我第一題AC的線段樹

題目簡述&#xff1a; 有N個整數&#xff0c;Q次操作&#xff0c;每次操作為詢問一個區間[a, b]內數的和(0號操作)或者把一個區間內的數全部加上v(1號操作) 線段樹求解即可。 #include <cstdio> #include <algorithm> using std::min; using std::max; #define L(n…

a頻繁連接不上redis_連接不到redis Caused by:..._慕課問答

redis裝在linux虛擬機上&#xff0c;在xshell上可以成功訪問redis&#xff0c;配了密碼拿了老師完整的代碼作測試&#xff0c;就是訪問失敗&#xff0c;不知道哪里出了問題地址端口密碼都沒錯的&#xff0c;求解org.springframework.data.redis.RedisConnectionFailureExceptio…

抓localhost包 - rawcap

抓localhost包的話用wireshark好像有點麻煩&#xff0c;所以用rawcap RawCap官網 RawCap下載連接 直接運行&#xff0c;首先根據需要選擇監聽相應的網卡&#xff0c;然后再填寫抓包文件保存的名字

持續集成交付CICD:Jira 發布流水線

目錄 一、實驗 1.環境 2.GitLab 查看項目 3.Jira 遠程觸發 Jenkins 實現合并 GitLab 分支 4.K8S master節點操作 5.Jira 發布流水線 一、實驗 1.環境 &#xff08;1&#xff09;主機 表1 主機 主機架構版本IP備注master1K8S master節點1.20.6192.168.204.180 jenkins…

計算幾何_多邊形

判定凸多邊形&#xff1a;頂點凹凸性法 連續三個頂點p1,p2,p3。計算p1p2,p2p3的叉乘&#xff0c;階乘大于0&#xff0c;則表示p3點在線段p1和p2的左側&#xff0c;然后依次計算下一個前后所組成向量的階乘&#xff0c;如果在計算時&#xff0c;出現負值&#xff0c;則此多邊形是…

wps完成率怎么設置_WPS表格中如何計算完成率?詳細操作方法看這里!

平時我們在使用像WPS這樣的辦公軟件時&#xff0c;我們經常會使用到其中的Excel表格軟件&#xff0c;來完成日常工作當中所需要完成的各種數據的統計以及錄入等工作。而在我們使用WPS表格來錄入、修改或者是統計某一些數據時&#xff0c;我們往往會因為表格內容的設定需求&…

[原創]WebScarab工具介紹

[原創]WebScarab工具介紹 一 WebScarab介紹 WebScarab是一個用來分析使用HTTP和HTTPS協議的應用程序框架。其原理很簡單&#xff0c;WebScarab可以記錄它檢測到的會話內容&#xff08;請求和應答&#xff09;&#xff0c;并允許使用者可以通過多種形式來查看記錄。WebScarab的設…

段表的作用

表格來自《程序員的自我修養 ——鏈接、裝載與庫》 ELF段名作用.text代碼段&#xff0c;存放執行語句.data數據段&#xff0c;存放初始化的全局變量和局部靜態變量.bss未初始化的全局變量和局部靜態變量.rodata只讀數據段.comment注釋信息段.note.GNU-stack堆棧提示段.debug調…

layoutSubviews總結

ios layout機制相關方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout——————– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在下面情況下會被調用&#xff1a; …