﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-yx-随笔分类-计算几何</title><link>http://www.cppblog.com/csu-yx-2013/category/19663.html</link><description>Algorithm Study And So On</description><language>zh-cn</language><lastBuildDate>Sun, 15 Sep 2013 10:06:12 GMT</lastBuildDate><pubDate>Sun, 15 Sep 2013 10:06:12 GMT</pubDate><ttl>60</ttl><item><title>poj 2187 Beauty Contest</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184784.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 23 Jul 2012 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184784.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184784.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184784.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184784.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;这个题我是按照discussion里面的说法，先求凸包，然后枚举过的。因为开始先把求凸包算法里面的用到了数组名搞混了，无故wa了好<br />多次。后面求凸包换了种算法过了。结果发现bug是搞混了数组名，然后把前面wa掉的代码下载下来，改好之后也都过了。<br />&nbsp; &nbsp;这个题主要是凸包算法需要处理有重复点，有多点共线之类的情况。那个按极角排序后，再求凸包的算法，对共点共线处理的不是很好，<br />不过那个算法也过了这个题。有个直接按坐标排序后，再求上凸包和下凸包的算法，可以处理共点共线的情况。这个算法比较优美啊，既不<br />需要找y坐标最小的点，也不需要按极角排序，直接按坐标排序下，然后求凸包即可。<br />&nbsp; &nbsp;这个算法的一点解释：<a href="http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull">http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull</a><br />&nbsp; &nbsp;另外，演算法笔记：<a href="http://www.csie.ntnu.edu.tw/~u91029/ConvexHull.html#a3">http://www.csie.ntnu.edu.tw/~u91029/ConvexHull.html#a3</a>上也有提到这个算法，我也是从这上面看到的。<br />这个算法可以假设是Graham排序基准点在无限远处，于是夹角大小的比较可以直接按水平坐标比较。<br /><br />代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&lt;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)&nbsp;<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;&lt;&nbsp;p.x&nbsp;||&nbsp;x&nbsp;==&nbsp;p.x&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />Point&nbsp;pts[50100];<br />Point&nbsp;pcs[50100];<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">int</span>&nbsp;nM;<br />inline&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;SDis(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Convex()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(pts,&nbsp;pts&nbsp;+&nbsp;nN);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;nM&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(nM&nbsp;&gt;=&nbsp;2&nbsp;&amp;&amp;&nbsp;Cross(pcs[nM&nbsp;-&nbsp;2],&nbsp;pcs[nM&nbsp;-&nbsp;1],&nbsp;pts[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcs[nM++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=&nbsp;nN&nbsp;-&nbsp;2,&nbsp;t&nbsp;=&nbsp;nM&nbsp;+&nbsp;1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;--i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;t&nbsp;&amp;&amp;&nbsp;Cross(pcs[nM&nbsp;-&nbsp;2],&nbsp;pcs[nM&nbsp;-&nbsp;1],&nbsp;pts[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcs[nM++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;nM--;<span style="color: #008000; ">//</span><span style="color: #008000; ">起点会被重复包含</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convex();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMax&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nM;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nM;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMax&nbsp;=&nbsp;max(nMax,&nbsp;SDis(pcs[i],&nbsp;pcs[j]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;nMax);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp; &nbsp;也可以用旋转卡壳算法来求最远点对，此题的完整代码如下：<br /><span id="Code_Open_Text_125336" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&lt;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)&nbsp;<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;&lt;&nbsp;p.x&nbsp;||&nbsp;x&nbsp;==&nbsp;p.x&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />Point&nbsp;pts[50100];<br />Point&nbsp;pcs[50100];<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">int</span>&nbsp;nM;<br />inline&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;SDis(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Convex()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(pts,&nbsp;pts&nbsp;+&nbsp;nN);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;nM&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(nM&nbsp;&gt;=&nbsp;2&nbsp;&amp;&amp;&nbsp;Cross(pcs[nM&nbsp;-&nbsp;2],&nbsp;pcs[nM&nbsp;-&nbsp;1],&nbsp;pts[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcs[nM++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=&nbsp;nN&nbsp;-&nbsp;2,&nbsp;t&nbsp;=&nbsp;nM&nbsp;+&nbsp;1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;--i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;t&nbsp;&amp;&amp;&nbsp;Cross(pcs[nM&nbsp;-&nbsp;2],&nbsp;pcs[nM&nbsp;-&nbsp;1],&nbsp;pts[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcs[nM++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;nM--;<span style="color: #008000; ">//</span><span style="color: #008000; ">起点会被重复包含</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convex();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMax&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nM;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nM;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nMax&nbsp;=&nbsp;max(nMax,&nbsp;SDis(pcs[i],&nbsp;pcs[j]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;nMax);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /></span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">#include&nbsp;&lt;stdio.h&gt;&nbsp;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;vector&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;&lt;&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;&lt;&nbsp;p.x&nbsp;||&nbsp;x&nbsp;==&nbsp;p.x&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">输入点集合,输出凸包</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;Convex(vector&lt;Point&gt;&amp;&nbsp;<span style="color: #0000FF; ">in</span>,&nbsp;vector&lt;Point&gt;&amp;&nbsp;<span style="color: #0000FF; ">out</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nM&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sort(<span style="color: #0000FF; ">in</span>.begin(),&nbsp;<span style="color: #0000FF; ">in</span>.end());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.resize(nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;2&nbsp;&amp;&amp;&nbsp;Cross(<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;2],&nbsp;<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;1],&nbsp;<span style="color: #0000FF; ">in</span>[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>[nM++]&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nN&nbsp;-&nbsp;2,&nbsp;t&nbsp;=&nbsp;nM&nbsp;+&nbsp;1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;--i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;t&nbsp;&amp;&amp;&nbsp;Cross(<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;2],&nbsp;<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;1],&nbsp;<span style="color: #0000FF; ">in</span>[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>[nM++]&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.resize(nM);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.pop_back();<span style="color: #008000; ">//</span><span style="color: #008000; ">起始点重复</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;SDis(Point&nbsp;a,Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;RC(vector&lt;Point&gt;&amp;&nbsp;vp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nP&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;vp.push_back(vp[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nAns&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(Cross(vp[i],&nbsp;vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP&nbsp;+&nbsp;1])&nbsp;&gt;&nbsp;Cross(vp[i],&nbsp;vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nP&nbsp;=&nbsp;(nP&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nAns&nbsp;=&nbsp;max(nAns,&nbsp;max(SDis(vp[i],&nbsp;vp[nP]),&nbsp;SDis(vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP&nbsp;+&nbsp;1])));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;vp.pop_back();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nAns;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;Point&gt;&nbsp;<span style="color: #0000FF; ">in</span>,&nbsp;<span style="color: #0000FF; ">out</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">in</span>.clear(),&nbsp;<span style="color: #0000FF; ">out</span>.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nN--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">in</span>.push_back(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convex(<span style="color: #0000FF; ">in</span>,&nbsp;<span style="color: #0000FF; ">out</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;RC(<span style="color: #0000FF; ">out</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp; &nbsp;关于旋转卡壳的算法描述，网上有很多资料，比如，<a href="http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html">http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html</a>&nbsp;<br />尤其关于这个求最远点对的。<span id="Code_Closed_Text_130220" style="border: 1px solid #808080; background-color: #ffffff; display: none; "></span><span id="Code_Open_Text_130220" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;vector&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;&lt;&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;&lt;&nbsp;p.x&nbsp;||&nbsp;x&nbsp;==&nbsp;p.x&nbsp;&amp;&amp;&nbsp;y&nbsp;&lt;&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">输入点集合,输出凸包</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;Convex(vector&lt;Point&gt;&amp;&nbsp;<span style="color: #0000FF; ">in</span>,&nbsp;vector&lt;Point&gt;&amp;&nbsp;<span style="color: #0000FF; ">out</span>)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nM&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sort(<span style="color: #0000FF; ">in</span>.begin(),&nbsp;<span style="color: #0000FF; ">in</span>.end());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.resize(nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;2&nbsp;&amp;&amp;&nbsp;Cross(<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;2],&nbsp;<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;1],&nbsp;<span style="color: #0000FF; ">in</span>[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>[nM++]&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nN&nbsp;-&nbsp;2,&nbsp;t&nbsp;=&nbsp;nM&nbsp;+&nbsp;1;&nbsp;i&nbsp;&gt;=&nbsp;0;&nbsp;--i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;t&nbsp;&amp;&amp;&nbsp;Cross(<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;2],&nbsp;<span style="color: #0000FF; ">out</span>[nM&nbsp;-&nbsp;1],&nbsp;<span style="color: #0000FF; ">in</span>[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>[nM++]&nbsp;=&nbsp;<span style="color: #0000FF; ">in</span>[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.resize(nM);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">out</span>.pop_back();<span style="color: #008000; ">//</span><span style="color: #008000; ">起始点重复</span><span style="color: #008000; "><br /></span>}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;SDis(Point&nbsp;a,Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;RC(vector&lt;Point&gt;&amp;&nbsp;vp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nP&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;vp.push_back(vp[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nAns&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(Cross(vp[i],&nbsp;vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP&nbsp;+&nbsp;1])&nbsp;&gt;&nbsp;Cross(vp[i],&nbsp;vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nP&nbsp;=&nbsp;(nP&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nAns&nbsp;=&nbsp;max(nAns,&nbsp;max(SDis(vp[i],&nbsp;vp[nP]),&nbsp;SDis(vp[i&nbsp;+&nbsp;1],&nbsp;vp[nP&nbsp;+&nbsp;1])));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;vp.pop_back();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nAns;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;Point&gt;&nbsp;<span style="color: #0000FF; ">in</span>,&nbsp;<span style="color: #0000FF; ">out</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">in</span>.clear(),&nbsp;<span style="color: #0000FF; ">out</span>.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nN--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">in</span>.push_back(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convex(<span style="color: #0000FF; ">in</span>,&nbsp;<span style="color: #0000FF; ">out</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;RC(<span style="color: #0000FF; ">out</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /></span></div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-23 22:18 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3525 Most Distant Point from the Sea</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184746.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 23 Jul 2012 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184746.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184746.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184746.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184746.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这个题的题意是给定一个凸多边形表示的海岛，求海岛离大海最远的距离。可以转化为一个凸多边形内部最多能够放入一个多大的圆。<br />显然可以对圆的半径进行二分，但是怎么确定圆心了。确定是否存在圆心，可以把原来的凸多边形往内部移动r（圆的半径）的距离之后，<br />再对新的多边形求半平面交，如果半平面交存在（是个点即可），那么当前大小的圆能够放入。<br />&nbsp; &nbsp;求半平面交的算法可以用上一篇中的N*N复杂度的基本算法。本题还涉及到一个知识，就是如何把一条直线往逆时针方向或者顺时针方向<br />移动R的距离。其实，可以根据单位圆那种思路计算。因为相当于以原来直线上的一点为圆心，以r为半径做圆，而且与原来的直线成90的夹<br />角，那么后来点的坐标是（(x0 + cos(PI / 2 +<font class="UNICODE">&#952;</font>&nbsp;))，（y0 + sin(PI / 2 +&nbsp;<font class="UNICODE">&#952;</font>))），转化一下就是(x0 - sin&#952;，y0 + cos&#952;)。那么直接可以<br />求出dx = /&nbsp;(vp[i].y - vp[(i + 1) % nN].y) * fR / fDis，dy = (vp[(i + 1) % nN].x - vp[i].x) * fR / fDis，fDis是线段的长度。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;代码如下：<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;vector&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPre&nbsp;=&nbsp;1e-8;<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,y;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p){x&nbsp;=&nbsp;p.x,&nbsp;y&nbsp;=&nbsp;p.y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point(<span style="color: #0000FF; ">double</span>&nbsp;fX,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY):x(fX),&nbsp;y(fY){}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&amp;&nbsp;<span style="color: #0000FF; ">operator</span>+(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;p.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;+=&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&amp;&nbsp;<span style="color: #0000FF; ">operator</span>+=(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>&nbsp;=&nbsp;*<span style="color: #0000FF; ">this</span>&nbsp;+&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&amp;&nbsp;<span style="color: #0000FF; ">operator</span>-(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;-=&nbsp;p.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;-=&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&amp;&nbsp;<span style="color: #0000FF; ">operator</span>*(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;*=&nbsp;fD;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;*=&nbsp;fD;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />typedef&nbsp;vector&lt;Point&gt;&nbsp;Polygon;<br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fabs(fD)&nbsp;&lt;&nbsp;fPre&nbsp;?&nbsp;0&nbsp;:&nbsp;(fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.x&nbsp;*&nbsp;b.y&nbsp;-&nbsp;a.y&nbsp;*&nbsp;b.x;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br />Point&nbsp;Intersection(Point&nbsp;a1,&nbsp;Point&nbsp;a2,&nbsp;Point&nbsp;b1,&nbsp;Point&nbsp;b2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;a&nbsp;=&nbsp;a2&nbsp;-&nbsp;a1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;b&nbsp;=&nbsp;b2&nbsp;-&nbsp;b1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;s&nbsp;=&nbsp;b1&nbsp;-&nbsp;a1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a1&nbsp;+&nbsp;a&nbsp;*&nbsp;(Cross(b,&nbsp;s)&nbsp;/&nbsp;Cross(b,&nbsp;a));<br />}<br /><br />Polygon&nbsp;Cut(Polygon&amp;&nbsp;pg,&nbsp;Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Polygon&nbsp;pgRet;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;pg.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fC&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;pg[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fD&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;pg[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DblCmp(fC)&nbsp;&gt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pgRet.push_back(pg[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DblCmp(fC&nbsp;*&nbsp;fD)&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pgRet.push_back(Intersection(a,&nbsp;b,&nbsp;pg[i],&nbsp;pg[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("pgRet&nbsp;number:%d\n",&nbsp;pgRet.size());</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pgRet;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Dis(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sqrt((a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y));<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">返回半平面的顶点个数</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">int</span>&nbsp;HalfPlane(Polygon&amp;&nbsp;vp,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fR)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Polygon&nbsp;pg;<br />&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(-1e9,&nbsp;-1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(1e9,&nbsp;-1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(1e9,&nbsp;1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(-1e9,&nbsp;1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fDis&nbsp;=&nbsp;Dis(vp[i],&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dx&nbsp;=&nbsp;(vp[i].y&nbsp;-&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN].y)&nbsp;*&nbsp;fR&nbsp;/&nbsp;fDis;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;dy&nbsp;=&nbsp;(vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN].x&nbsp;-&nbsp;vp[i].x)&nbsp;*&nbsp;fR&nbsp;/&nbsp;fDis;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;a&nbsp;=&nbsp;vp[i],&nbsp;b&nbsp;=&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN],&nbsp;c(dx,&nbsp;dy);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;+=&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;+=&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%f&nbsp;%f&nbsp;%f&nbsp;%f\n",&nbsp;a.x,&nbsp;a.y,&nbsp;b.x,&nbsp;b.y);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg&nbsp;=&nbsp;Cut(pg,&nbsp;a,&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pg.size()&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pg.size();<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;Point&gt;&nbsp;vp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.push_back(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fMin&nbsp;=&nbsp;0.0,&nbsp;fMax&nbsp;=&nbsp;10000.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(DblCmp(fMin&nbsp;-&nbsp;fMax))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fMid&nbsp;=&nbsp;(fMin&nbsp;+&nbsp;fMax)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nRet&nbsp;=&nbsp;HalfPlane(vp,&nbsp;fMid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("fMid:%f,&nbsp;nRet:%d\n",&nbsp;fMid,&nbsp;nRet);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nRet&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMax&nbsp;=&nbsp;fMid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMin&nbsp;=&nbsp;fMid;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.6f\n",&nbsp;fMax);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-23 16:45 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3130 How I Mathematician Wonder What You Are!</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184701.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Mon, 23 Jul 2012 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184701.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184701.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184701.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;半平面交的一个题，也是求多边形的核心。求出这个好像也可以用于解决一些线性规划问题。我用的是N*N的基本算法，每加入一条直线，<br />就对原来求出的半平面交进行处理，产生新的核心。<br />&nbsp; &nbsp;代码参照台湾的一个网站演算法笔记上的内容和代码。表示这个网站巨不错，求凸包的算法也参照了这个网站上的内容和代码。<br />半平面交的地址：<a href="http://www.csie.ntnu.edu.tw/~u91029/Half-planeIntersection.html#a4">http://www.csie.ntnu.edu.tw/~u91029/Half-planeIntersection.html#a4</a><br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;代码思路主要是：先读入所有的多边形顶点，放入一个vector（vp）里面，然后对多边形的每条边求一个半平面。刚开始的时候，用一个<br />vector（Polygon）保存代表上下左右四个无限远角的四个点，表示原始的半平面。然后，用读入的多边形的每条边去切割原来的半平面。<br />切割的过程是，如果原来（Polygon）中的点在当前直线的指定一侧，那么原来的点还是有效的。如果原来的点和它相邻的下一个点与当前<br />直线相交，那么还需要把交点加入Polygon集合。<br />&nbsp; &nbsp;还有求交点的方法比较奇葩，类似于黑书上面的那种根据面积等分的方法。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;vector&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;fPre&nbsp;=&nbsp;1e-8;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;Point(<span style="color: #0000FF; ">double</span>&nbsp;fX,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;fX,&nbsp;y&nbsp;=&nbsp;fY;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br />typedef&nbsp;vector&lt;Point&gt;&nbsp;Polygon;<br />typedef&nbsp;pair&lt;Point,&nbsp;Point&gt;&nbsp;Line;<br />Point&nbsp;<span style="color: #0000FF; ">operator</span>+(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.x&nbsp;=&nbsp;a.x&nbsp;+&nbsp;b.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.y&nbsp;=&nbsp;a.y&nbsp;+&nbsp;b.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;t;<br />}<br /><br />Point&nbsp;<span style="color: #0000FF; ">operator</span>-(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.x&nbsp;=&nbsp;a.x&nbsp;-&nbsp;b.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.y&nbsp;=&nbsp;a.y&nbsp;-&nbsp;b.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;t;<br />}<br /><br />Point&nbsp;<span style="color: #0000FF; ">operator</span>*(Point&nbsp;a,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.x&nbsp;=&nbsp;a.x&nbsp;*&nbsp;fD;<br />&nbsp;&nbsp;&nbsp;&nbsp;t.y&nbsp;=&nbsp;a.y&nbsp;*&nbsp;fD;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;t;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fabs(fD)&nbsp;&lt;&nbsp;fPre&nbsp;?&nbsp;0&nbsp;:&nbsp;(fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">3点叉积</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">向量叉积</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.x&nbsp;*&nbsp;b.y&nbsp;-&nbsp;a.y&nbsp;*&nbsp;b.x;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">求直线交点的一种简便方法<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">平行四边形面积的比例等于高的比例</span><span style="color: #008000; "><br /></span>Point&nbsp;Intersection(Point&nbsp;a1,&nbsp;Point&nbsp;a2,&nbsp;Point&nbsp;b1,&nbsp;Point&nbsp;b2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;a&nbsp;=&nbsp;a2 -&nbsp;a1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;b&nbsp;=&nbsp;b2 -&nbsp;b1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;s&nbsp;=&nbsp;b1&nbsp;-&nbsp;a1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a1&nbsp;+&nbsp;a&nbsp;*&nbsp;(Cross(b,&nbsp;s)&nbsp;/&nbsp;Cross(b,&nbsp;a));<br />}<br /><br />Polygon&nbsp;HalfPlane(Polygon&amp;&nbsp;pg,&nbsp;Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Polygon&nbsp;pgTmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;pg.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fC&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;pg[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fD&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;pg[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DblCmp(fC)&nbsp;&gt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pgTmp.push_back(pg[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fC&nbsp;*&nbsp;fD&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pgTmp.push_back(Intersection(a,&nbsp;b,&nbsp;pg[i],&nbsp;pg[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pgTmp;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;Point&gt;&nbsp;vp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Polygon&nbsp;pg;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.push_back(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(-1e9,&nbsp;1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(-1e9,&nbsp;-1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(1e9,&nbsp;-1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg.push_back(Point(1e9,&nbsp;1e9));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg&nbsp;=&nbsp;HalfPlane(pg,&nbsp;vp[i],&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pg.size()&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("0\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pg.size())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("1\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-23 10:41 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/23/184701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1584 A Round Peg in a Ground Hole</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184396.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 20 Jul 2012 13:41:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184396.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184396.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184396.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这个题需要多个计算几何算法。第一个是判断一系列点是否能够构成凸多边形，第二个是判断一个点是否在一个简单多边形内部，<br />第三个是求一个点到一条线段（或者说直线）的距离，第四个是判断一个圆是否则一个凸多边形内部。<br />&nbsp; &nbsp;其实，我是要判断一个圆是否则一个凸多边形内部而用到算法二和三。其实，有不需要判断圆心是否则多边形内部的算法。<br />&nbsp; &nbsp;算法一的思想，求所有边的偏转方向，必须都是逆时针或者顺时针偏转。算法二则是我前面发的那篇改进弧长法判断点和多边形的关系，<br />算法三尤其简单，直线上面取2点，用叉积求出这三点构成的三角形面积的2倍，再除以底边。算法四则是先判断圆心在多边形内部，然后<br />判断圆心到所有边的距离要大于圆的半径。<br />&nbsp; &nbsp;贴出代码，纯粹为了以后作为模版使用等，防止遗忘，方便查找，其实现在也能手敲出来了。<br /><br />&nbsp;代码如下：<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div>#include&nbsp;&lt;stdio.h&gt;</div>#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;vector&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPre&nbsp;=&nbsp;1e-8;<br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fD)&nbsp;&lt;&nbsp;fPre)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;==&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DblCmp(x&nbsp;-&nbsp;p.x)&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;DblCmp(y&nbsp;-&nbsp;p.y)&nbsp;==&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br />Point&nbsp;<span style="color: #0000FF; ">operator</span>-(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.x&nbsp;=&nbsp;a.x&nbsp;-&nbsp;b.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.y&nbsp;=&nbsp;a.y&nbsp;-&nbsp;b.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;IsConvexPolygon(vector&lt;Point&gt;&amp;&nbsp;vp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nDirection&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bLine&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">避免所有点共线</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTemp&nbsp;=&nbsp;DblCmp(Cross(vp[i],&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN],&nbsp;vp[(i&nbsp;+&nbsp;2)&nbsp;%&nbsp;nN]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nTemp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bLine&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这次的方向和上次的方向必须是相同的或者是3点和3点以上共线的情况</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nDirection&nbsp;*&nbsp;nTemp&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nDirection&nbsp;=&nbsp;nTemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;bLine&nbsp;==&nbsp;<span style="color: #0000FF; ">false</span>;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetQuadrant(Point&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p.x&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;(p.y&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;0&nbsp;:&nbsp;3)&nbsp;:&nbsp;(p.y&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;2);<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;IsPtInPolygon(vector&lt;Point&gt;&amp;&nbsp;vp,&nbsp;Point&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nA1,&nbsp;nA2,&nbsp;nSum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;nA1&nbsp;=&nbsp;GetQuadrant(vp[0]&nbsp;-&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(vp[i]&nbsp;==&nbsp;p)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nC&nbsp;=&nbsp;DblCmp(Cross(p,&nbsp;vp[i],&nbsp;vp[j]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT1&nbsp;=&nbsp;DblCmp((vp[i].x&nbsp;-&nbsp;p.x)&nbsp;*&nbsp;(vp[j].x&nbsp;-&nbsp;p.x));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT2&nbsp;=&nbsp;DblCmp((vp[i].y&nbsp;-&nbsp;p.y)&nbsp;*&nbsp;(vp[j].y&nbsp;-&nbsp;p.y));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!nC&nbsp;&amp;&amp;&nbsp;nT1&nbsp;&lt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;nT2&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nA2&nbsp;=&nbsp;GetQuadrant(vp[j]&nbsp;-&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;((nA2&nbsp;-&nbsp;nA1&nbsp;+&nbsp;4)&nbsp;%&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nC&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;+=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;-=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;3:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nA1&nbsp;=&nbsp;nA2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&lt;&nbsp;nN&nbsp;||&nbsp;nSum)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;PtDis(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sqrt((a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(b.y&nbsp;-&nbsp;a.y)&nbsp;*&nbsp;(b.y&nbsp;-&nbsp;a.y));<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">点p到直线ab的距离<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">h&nbsp;=&nbsp;(2&nbsp;*&nbsp;Spab)&nbsp;/&nbsp;|ab|</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">double</span>&nbsp;GetDis(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fabs(Cross(a,&nbsp;b,&nbsp;p))&nbsp;/&nbsp;PtDis(a,&nbsp;b);<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;IsCircleInPolygon(vector&lt;Point&gt;&amp;&nbsp;vp,&nbsp;Point&nbsp;p,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fR)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!IsPtInPolygon(vp,&nbsp;p))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN&nbsp;=&nbsp;vp.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(GetDis(vp[i],&nbsp;vp[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN],&nbsp;p)&nbsp;&lt;&nbsp;fR)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fR,&nbsp;fPx,&nbsp;fPy;<br />&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;Point&gt;&nbsp;vp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d%lf%lf%lf",&nbsp;&amp;nN,&nbsp;&amp;fR,&nbsp;&amp;fPx,&nbsp;&amp;fPy),&nbsp;nN&nbsp;&gt;=&nbsp;3)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vp.push_back(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsConvexPolygon(vp))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.x&nbsp;=&nbsp;fPx;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.y&nbsp;=&nbsp;fPy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsCircleInPolygon(vp,&nbsp;p,&nbsp;fR))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("PEG&nbsp;WILL&nbsp;FIT\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("PEG&nbsp;WILL&nbsp;NOT&nbsp;FIT\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("HOLE&nbsp;IS&nbsp;ILL-FORMED\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-20 21:41 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1265 Area</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184357.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 20 Jul 2012 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184357.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184357.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184357.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;此题用到了几个知识，一个是求多边形面积的公式。然后是，根据顶点都在整点上求多边形边界上的顶点数目的方法。最后一个是pick<br />定理。根据前面2个信息和pick定理算出在多边形内部的整点的个数。<br />&nbsp; &nbsp;求多边形面积的方法还是叉积代表有向面积的原理，把原点看做另外的一个点去分割原来的多边形为N个三角形，然后把它们的有向面<br />积加起来。<br />&nbsp; &nbsp;判断边界上点的个数是根据Gcd（dx,dy)代表当前边上整数点的个数的结论。这个结论的证明其实也比较简单，假设dx = a，dy = b。<br />初始点是x0，y0，假设d = Gcd（a，b）。那么边上的点可以被表示为（x0 + k * (a / d)，y0 + k * （b / d))。为了使点是整数点，<br />k必须是整数，而且0&lt;= k &lt;=d，所以最多有d个这个的点。<br />&nbsp; &nbsp;求多边形内部点的个数用的是pick定理。面积 = 内部点 + 边界点 / 2 - 1。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(100&nbsp;+&nbsp;10)<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,&nbsp;y;<br />};<br />Point&nbsp;pts[MAX];<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;IN&nbsp;=&nbsp;1;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;EAGE&nbsp;=&nbsp;2;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;OUT&nbsp;=&nbsp;3;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPre&nbsp;=&nbsp;1e-8;<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;GetArea()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fArea&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;ori&nbsp;=&nbsp;{0.0,&nbsp;0.0};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fArea&nbsp;+=&nbsp;Cross(ori,&nbsp;pts[i],&nbsp;pts[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fabs(fArea)&nbsp;*&nbsp;0.5;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;gcd(<span style="color: #0000FF; ">int</span>&nbsp;nX,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nY)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nX&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nX&nbsp;=&nbsp;-nX;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nY&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nY&nbsp;=&nbsp;-nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nX&nbsp;&lt;&nbsp;nY)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(nX,&nbsp;nY);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nY)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT&nbsp;=&nbsp;nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nY&nbsp;=&nbsp;nX&nbsp;%&nbsp;nY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nX&nbsp;=&nbsp;nT;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nX;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nI,&nbsp;nE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fArea;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dx&nbsp;,dy;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;nT;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nI&nbsp;=&nbsp;nE&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[0].x&nbsp;=&nbsp;pts[0].y&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&nbsp;&amp;dx,&nbsp;&amp;dy);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].x&nbsp;=&nbsp;pts[j&nbsp;-&nbsp;1].x&nbsp;+&nbsp;dx;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].y&nbsp;=&nbsp;pts[j&nbsp;-&nbsp;1].y&nbsp;+&nbsp;dy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nE&nbsp;+=&nbsp;gcd(dx,&nbsp;dy);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fArea&nbsp;=&nbsp;GetArea();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nI&nbsp;=&nbsp;(fArea&nbsp;+&nbsp;1)&nbsp;-&nbsp;nE&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Scenario&nbsp;#%d:\n%d&nbsp;%d&nbsp;%.1f\n\n",&nbsp;i,&nbsp;nI,&nbsp;nE,&nbsp;fArea);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-20 15:36 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zoj 1081 Points Within - 改进弧长法判断点和简单多边形的关系</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184308.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Fri, 20 Jul 2012 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184308.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184308.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184308.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184308.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;转角法判断点和多边形的关系大家都知道，原理比较简单，在多边形内扫过的转角一定是360度，在边界上和外面则不一定。<br />&nbsp;实现起来也比较麻烦，浮点误差比较大，而且还要考虑些特殊情况。<br />&nbsp; &nbsp;在网上找到一种叫做改进弧长法的算法，原理和转角法类似，但是做了很多重要的改进。比如，计算转角改成了计算叉积，根据叉积决定<br />旋转方向，还要根据计算下一个点的象限决定偏转多少，每次偏转的都是90度的倍数。<br />&nbsp; &nbsp;该算法可以方便判断出点在多边形内，还是边界上，还是在多边形外面。<br /><br />&nbsp; &nbsp;摘自别人对该算法的描述如下：<br />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">首先从该书中摘抄一段弧长法的介绍：&#8220;弧长法要求多边形是有向多边形，一般规</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">定沿多边形的正向，边的左侧为多边形的内侧域。<br />以被测点为圆心作单位圆，将全部有向</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">边向单位圆作径向投影，并计算其中单位圆上弧长的代数和。若代数和为0，则点在多边形</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">外部；<br />若代数和为2&#960;则点在多边形内部；若代数和为&#960;，则点在多边形上。&#8221;</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">按书上的这个介绍，其实弧长法就是转角法。但它的改进方法比较厉害：将坐标原</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">点平移到被测点P，这个新坐标系将平面划分为4个<br />象限，对每个多边形顶点P ，只考虑</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">其所在的象限，然后按邻接顺序访问多边形的各个顶点P，分析P和P[i+1]，有下列</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">三种情况：</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">（1）P[i+1]在P的下一象限。此时弧长和加&#960;/2；</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">（2）P[i+1]在P的上一象限。此时弧长和减&#960;/2；</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " /><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">（3）P[i+1]在Pi的相对象限。首先计算f=y[i+1]*x-x[i+1]*y（叉积），若f=</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">0，则点在多边形上；若f&lt;0，弧长和减&#960;；若f&gt;0，弧长和加&#960;。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">最后对算出的代数和和上述的情况一样判断即可。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">实现的时候还有两点要注意，第一个是若P的某个坐标为0时，一律当正号处理；</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">第二点是若被测点和多边形的顶点重合时要特殊处理。<br /></span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">以上就是书上讲解的内容，其实还存在一个问题。那就是当多边形的某条边在坐标</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">轴上而且两个顶点分别在原点的两侧时会出错。<br />如边(3,0)-(-3,0)，按以上的处理，象限</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">分别是第一和第二，这样会使代数和加&#960;/2，有可能导致最后结果是被测点在多边形外。</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">而实际上<br />被测点是在多边形上（该边穿过该点）。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">对于这点，我的处理办法是：每次算P和P[i+1]时，就计算叉积和点积，判断该</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">点是否在该边上，是则判断结束，否则继续上述过程。<br />这样牺牲了时间，但保证了正确性</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">。</span><br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />&nbsp; &nbsp;<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">具体实现的时候，由于只需知道当前点和上一点的象限位置，所以附加空间只需O(</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">1)。实现的时候可以把上述的&#8220;&#960;/2&#8221;改成1，&#8220;&#960;&#8221;改成2，<br />这样便可以完全使用整数进</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">行计算。不必考虑顶点的顺序，逆时针和顺时针都可以处理，只是最后的代数和符号不同</span><span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">而已。整个算法编写<br />起来非常容易。<br /><br />代码如下：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(100&nbsp;+&nbsp;10)<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,y;<br />};<br /><br />Point&nbsp;pts[MAX];<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;OUT&nbsp;=&nbsp;0;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;IN&nbsp;=&nbsp;1;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;EDGE&nbsp;=&nbsp;2;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPre&nbsp;=&nbsp;1e-8;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fD)&nbsp;&lt;&nbsp;fPre)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;GetQuadrant(Point&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DblCmp(p.x)&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;(DblCmp(p.y)&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;0&nbsp;:&nbsp;3)&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(DblCmp(p.y)&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;2);<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;PtInPolygon(Point*&nbsp;pts,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;Point&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;j,&nbsp;k;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].x&nbsp;-=&nbsp;p.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].y&nbsp;-=&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nA1,&nbsp;nA2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nSum&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;nA1&nbsp;=&nbsp;GetQuadrant(pts[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;=&nbsp;(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DblCmp(pts[k].x)&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;DblCmp(pts[k].y)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">与顶点重合</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nC&nbsp;=&nbsp;DblCmp(Det(pts[i].x,&nbsp;pts[i].y,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[k].x,&nbsp;pts[k].y));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!nC&nbsp;&amp;&amp;&nbsp;DblCmp(pts[i].x&nbsp;*&nbsp;pts[k].x)&nbsp;&lt;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;DblCmp(pts[i].y&nbsp;*&nbsp;pts[k].y)&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">边上</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nA2&nbsp;=&nbsp;GetQuadrant(pts[k]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((nA1&nbsp;+&nbsp;1)&nbsp;%&nbsp;4&nbsp;==&nbsp;nA2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;+=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((nA1&nbsp;+&nbsp;2)&nbsp;%&nbsp;4&nbsp;==&nbsp;nA2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nC&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;+=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;-=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;((nA1&nbsp;+&nbsp;3)&nbsp;%&nbsp;4&nbsp;==&nbsp;nA2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nSum&nbsp;-=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nA1&nbsp;=&nbsp;nA2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].x&nbsp;+=&nbsp;p.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[j].y&nbsp;+=&nbsp;p.y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&lt;&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;EDGE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nSum)<span style="color: #008000; ">//</span><span style="color: #008000; ">逆时针nSum&nbsp;==&nbsp;4,&nbsp;顺时针nSum&nbsp;==&nbsp;-4</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IN;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;OUT;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN,&nbsp;nM;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nCase&nbsp;=&nbsp;1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d%d",&nbsp;&amp;nN,&nbsp;&amp;nM),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nCase&nbsp;&gt;&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Problem&nbsp;%d:\n",&nbsp;nCase++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nM;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;p.x,&nbsp;&amp;p.y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(PtInPolygon(pts,&nbsp;nN,&nbsp;p))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Within\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Outside\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-20 10:30 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/20/184308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3348 Cows</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184112.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Wed, 18 Jul 2012 12:28:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184112.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184112.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184112.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184112.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这个题用到2个计算几何算法。求解凸包和简单多边形面积。凸包算法详细解释见算法导论。求解多边形面积的思想是将多边形分解为三角<br />形，一般是假设按顺序取多边形上面连续的2点与原点组合成一个三角形，依次下去用叉积求有向面积之和，最后取绝对值即可。注意，这些<br />点必须是在多边形上逆时针或者顺时针给出的，而求出凸包刚好给了这样的一系列点。<br />&nbsp; &nbsp;凸包代码，其实先找出一个y坐标最小的点，再对剩下的所有点按极角排序。然后对排序后的点进行一个二维循环即可。二维循环的解释是<br />当加入新的点进入凸包集合时候，如果与以前加入的点形成的偏转方向不一致，那么前面那些点都需要弹出集合。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX_N&nbsp;(10000&nbsp;+&nbsp;10)<br /><br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;&lt;(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;p)&nbsp;<span style="color: #0000FF; ">const</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;y&nbsp;&lt;&nbsp;p.y&nbsp;||&nbsp;y&nbsp;==&nbsp;p.y&nbsp;&amp;&amp;&nbsp;x&nbsp;&lt;&nbsp;p.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br />Point&nbsp;pts[MAX_N];<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br />Point&nbsp;ans[MAX_N];<br /><span style="color: #0000FF; ">int</span>&nbsp;nM;<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.x&nbsp;-&nbsp;a.x,&nbsp;b.y&nbsp;-&nbsp;a.y,&nbsp;c.x&nbsp;-&nbsp;a.x,&nbsp;c.y&nbsp;-&nbsp;a.y);<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;CrossCmp(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;cs&nbsp;=&nbsp;Cross(pts[0],&nbsp;a,&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cs&nbsp;&gt;&nbsp;0&nbsp;||&nbsp;cs&nbsp;==&nbsp;0&nbsp;&amp;&amp;&nbsp;a.x&nbsp;&lt;&nbsp;b.x;&nbsp;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;Scan()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;nM&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(pts&nbsp;+&nbsp;1,&nbsp;pts&nbsp;+&nbsp;nN,&nbsp;CrossCmp);<span style="color: #008000; ">//</span><span style="color: #008000; ">对所有点按极角排序,逆时针偏转<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">第0-2个点，其实不会进入第二重循环的<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">从第3个点开始，就依次检查与凸包中前面点形成的边的偏转方向<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果不是逆时针偏转，则弹出该点</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nM&nbsp;&gt;=&nbsp;2&nbsp;&amp;&amp;&nbsp;Cross(ans[nM&nbsp;-&nbsp;2],&nbsp;ans[nM&nbsp;-&nbsp;1],&nbsp;pts[i])&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nM--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[nM++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;GetArea()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fAns&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;ori&nbsp;=&nbsp;{0.0,&nbsp;0.0};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nM;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fAns&nbsp;+=&nbsp;Cross(ori,&nbsp;ans[i],&nbsp;ans[(i&nbsp;+&nbsp;1)&nbsp;%&nbsp;nM]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fabs(fAns)&nbsp;*&nbsp;0.5;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pts[i]&nbsp;&lt;&nbsp;pts[0])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(pts[i],&nbsp;pts[0]);<span style="color: #008000; ">//</span><span style="color: #008000; ">pts[0]是y坐标最小的点</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scan();<span style="color: #008000; ">//</span><span style="color: #008000; ">扫描出凸包</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fArea&nbsp;=&nbsp;GetArea();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;(<span style="color: #0000FF; ">int</span>)(fArea&nbsp;/&nbsp;50));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-18 20:28 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 3714 Raid and hdu 1007 Quoit Design</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184049.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Wed, 18 Jul 2012 05:53:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184049.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/184049.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/184049.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/184049.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;典型的最近点对算法的应用，不过这个题多了个限制条件，就是点分为2类，最短距离必须在不同的类之间。为了满足这个限制，只需要<br />把同类别点直接的距离都当作INF处理即可。<br />&nbsp; &nbsp;最近点对的算法，算导上面说是nlogn的。但是这个复杂度实现起来略微麻烦点，有一种实现方法是n*logn*logn的，其只对x坐标进行<br />了排序。n*logn的算法需要对x和y分量分别进行排序，还需要用到其它的辅助数组。<br />&nbsp; &nbsp;第一个题我用了n*logn算法实现了，第二个题则用了n*logn*logn算法实现了。但是时间上相差不大，因为第一个算法每次进行分治时<br />候消耗的O(n)时间也有几次。第二个算法分治时候，需要再次排序的时间也不一定很多，因为可能数据量不够大。<br />&nbsp; &nbsp;算法的本质就是二分按照X排序好的点数组，n*logn*logn变成n*logn的关键是预先对y也排序好一个点数组，因为按y排序好的点数组，<br />在分治后的合并中要用到。算法更详细的解释请参照算法导论。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="font-size: 14px; ">poj 3714 代码如下：</span>&nbsp;<br /><br />#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX_N&nbsp;(100000&nbsp;*&nbsp;2&nbsp;+&nbsp;10)<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;FINF&nbsp;=&nbsp;1LL&nbsp;&lt;&lt;&nbsp;60;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nKind;<br />};<br />Point&nbsp;pts[MAX_N],&nbsp;ptsY[MAX_N],&nbsp;ptsTemp[MAX_N];<br />Point&nbsp;ptsSave[MAX_N];<br /><span style="color: #0000FF; ">int</span>&nbsp;nNum;<br /><span style="color: #0000FF; ">bool</span>&nbsp;CmpX(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.x&nbsp;&lt;&nbsp;b.x;<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;CmpY(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.y&nbsp;&lt;&nbsp;b.y;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Dis(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(a.nKind&nbsp;==&nbsp;b.nKind)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FINF;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sqrt((a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(a.y&nbsp;-&nbsp;b.y)&nbsp;*&nbsp;(a.y&nbsp;-&nbsp;b.y));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;FindMinDis(Point&nbsp;pts[],&nbsp;Point&nbsp;ptsY[],&nbsp;Point&nbsp;ptsTemp[],&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nBeg,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nEnd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nBeg&nbsp;==&nbsp;nEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FINF;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nBeg&nbsp;+&nbsp;1&nbsp;==&nbsp;nEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Dis(pts[nBeg],&nbsp;pts[nEnd]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nBeg&nbsp;+&nbsp;2&nbsp;==&nbsp;nEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;min(min(Dis(pts[nBeg],&nbsp;pts[nBeg&nbsp;+&nbsp;1]),&nbsp;Dis(pts[nBeg],&nbsp;pts[nEnd])),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dis(pts[nBeg&nbsp;+&nbsp;1],&nbsp;pts[nEnd]));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(ptsSave&nbsp;+&nbsp;nBeg,&nbsp;ptsY&nbsp;+&nbsp;nBeg,&nbsp;<span style="color: #0000FF; ">sizeof</span>(Point)&nbsp;*&nbsp;(nEnd&nbsp;-&nbsp;nBeg&nbsp;+&nbsp;1));//保存当前的Y坐标顺序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMid&nbsp;=&nbsp;(nBeg&nbsp;+&nbsp;nEnd)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nL&nbsp;=&nbsp;nBeg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nR&nbsp;=&nbsp;nMid&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nBeg;&nbsp;i&nbsp;&lt;=&nbsp;nEnd;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ptsY[i].x&nbsp;-&nbsp;pts[nMid].x&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsTemp[nL++]&nbsp;=&nbsp;ptsY[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsTemp[nR++]&nbsp;=&nbsp;ptsY[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fAns&nbsp;=&nbsp;min(FindMinDis(pts,&nbsp;ptsTemp,&nbsp;ptsY,&nbsp;nBeg,&nbsp;nMid),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindMinDis(pts,&nbsp;ptsTemp,&nbsp;ptsY,&nbsp;nMid&nbsp;+&nbsp;1,&nbsp;nEnd));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nK&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nBeg;&nbsp;i&nbsp;&lt;=&nbsp;nEnd;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(ptsSave[i].x&nbsp;-&nbsp;pts[nMid].x)&nbsp;&lt;=&nbsp;fAns)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsTemp[nK++]&nbsp;=&nbsp;ptsSave[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nK;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nK;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ptsTemp[j].y&nbsp;-&nbsp;ptsTemp[i].y&nbsp;&gt;&nbsp;fAns)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fAns&nbsp;=&nbsp;min(fAns,&nbsp;Dis(ptsTemp[i],&nbsp;ptsTemp[j]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fAns;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nT;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">printf("%f",&nbsp;FINF);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nT--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;nN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nNum&nbsp;=&nbsp;nN&nbsp;*&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[i].nKind&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nN;&nbsp;i&nbsp;&lt;&nbsp;nNum;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pts[i].nKind&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(ptsY,&nbsp;pts,&nbsp;<span style="color: #0000FF; ">sizeof</span>(Point)&nbsp;*&nbsp;nNum);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(pts,&nbsp;pts&nbsp;+&nbsp;nNum,&nbsp;CmpX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(ptsY,&nbsp;ptsY&nbsp;+&nbsp;nNum,&nbsp;CmpY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.3f\n",&nbsp;FindMinDis(pts,&nbsp;ptsY,&nbsp;ptsTemp,&nbsp;0,&nbsp;nNum&nbsp;-&nbsp;1));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br />hdu 1007 代码如下：<br /><div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX&nbsp;(100000&nbsp;+&nbsp;10)<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;x,&nbsp;y;<br />};<br />Point&nbsp;pts[MAX];<br />Point&nbsp;ptsTemp[MAX];<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;FINF&nbsp;=&nbsp;1LL&nbsp;&lt;&lt;&nbsp;60;<br /><span style="color: #0000FF; ">bool</span>&nbsp;CmpX(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.x&nbsp;&lt;&nbsp;b.x;<br />}<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;CmpY(<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;a,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;Point&amp;&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;a.y&nbsp;&lt;&nbsp;b.y;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Dis(Point&nbsp;a,&nbsp;Point&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;sqrt((a.x&nbsp;-&nbsp;b.x)&nbsp;*&nbsp;(a.x&nbsp;-&nbsp;b.x)&nbsp;+&nbsp;(b.y&nbsp;-&nbsp;a.y)&nbsp;*&nbsp;(b.y&nbsp;-&nbsp;a.y));<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Find(<span style="color: #0000FF; ">int</span>&nbsp;nL,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nH)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nL&nbsp;==&nbsp;nH)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FINF;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nL&nbsp;+&nbsp;1&nbsp;==&nbsp;nH)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Dis(pts[nL],&nbsp;pts[nH]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nL&nbsp;+&nbsp;2&nbsp;==&nbsp;nH)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;min(Dis(pts[nL],&nbsp;pts[nL&nbsp;+&nbsp;1]),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min(Dis(pts[nL],&nbsp;pts[nH]),&nbsp;Dis(pts[nH],&nbsp;pts[nL&nbsp;+&nbsp;1])));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nMid&nbsp;=&nbsp;(nL&nbsp;+&nbsp;nH)&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fAns&nbsp;=&nbsp;min(Find(nL,&nbsp;nMid),&nbsp;Find(nMid&nbsp;+&nbsp;1,&nbsp;nH));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nK&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;nL;&nbsp;i&nbsp;&lt;=&nbsp;nH;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(pts[i].x&nbsp;-&nbsp;pts[nMid].x)&nbsp;&lt;=&nbsp;fAns)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptsTemp[nK++]&nbsp;=&nbsp;pts[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(ptsTemp,&nbsp;ptsTemp&nbsp;+&nbsp;nK,&nbsp;CmpY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nK;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;&nbsp;nK;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ptsTemp[j].y&nbsp;-&nbsp;ptsTemp[i].y&nbsp;&gt;=&nbsp;fAns)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fAns&nbsp;=&nbsp;min(fAns,&nbsp;Dis(ptsTemp[j],&nbsp;ptsTemp[i]));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fAns;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nN;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf",&nbsp;&amp;pts[i].x,&nbsp;&amp;pts[i].y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(pts,&nbsp;pts&nbsp;+&nbsp;nN,&nbsp;CmpX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%.2f\n",&nbsp;Find(0,&nbsp;nN&nbsp;-1)&nbsp;*&nbsp;0.5);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/184049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-18 13:53 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/18/184049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 1269 Intersecting Lines</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/17/183895.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Tue, 17 Jul 2012 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/17/183895.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/183895.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/17/183895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/183895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/183895.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;题目意思是给出2条直线，然后判断其是否相交，平行，还是重合。刚开始以为是判断2条线段的关系，用了黑书的模板写了，发现连样例<br />都过不了。后面改了很多才过了。先判断2条直线所在的向量是否平行，这个可以判断这2个向量的叉积是否为0，然后再判断线段是否重合，<br />可以选3点判断叉积是否为0。如果向量不平行的话，直接求交点。求交点的公式是用了黑书里面的方法，先求出2个叉积代表2个三角形的<br />有向面积，然后根据定比分点的关系（面积的比例等于交点分其中一条线段的比例）可以推出计算公式。<br />&nbsp; &nbsp;有叉积和点积这2个工具确实能方便的解决很多问题。<br /><br />&nbsp; &nbsp;代码如下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;stdio.h&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">struct</span>&nbsp;Point<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY;<br />};<br />Point&nbsp;beg[2],&nbsp;end[2];<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPrecision&nbsp;=&nbsp;1e-8;<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Cross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.fX&nbsp;-&nbsp;a.fX,&nbsp;b.fY&nbsp;-&nbsp;a.fY,&nbsp;c.fX&nbsp;-&nbsp;a.fX,&nbsp;c.fY&nbsp;-&nbsp;a.fY);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fD)&nbsp;&lt;&nbsp;fPrecision)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;DotDet(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fX2&nbsp;+&nbsp;fY1&nbsp;*&nbsp;fY2;<br />}<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Dot(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DotDet(b.fX&nbsp;-&nbsp;a.fX,&nbsp;b.fY&nbsp;-&nbsp;a.fY,&nbsp;c.fX&nbsp;-&nbsp;a.fX,&nbsp;c.fY&nbsp;-&nbsp;a.fY);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;BetweenCmp(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DblCmp(Dot(a,&nbsp;b,&nbsp;c));<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;SegCross(Point&nbsp;a,&nbsp;Point&nbsp;b,&nbsp;Point&nbsp;c,&nbsp;Point&nbsp;d,&nbsp;Point&amp;&nbsp;p)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;s1,&nbsp;s2,&nbsp;s3,&nbsp;s4;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d1,&nbsp;d2,&nbsp;d3,&nbsp;d4;<br />&nbsp;&nbsp;&nbsp;&nbsp;d1&nbsp;=&nbsp;DblCmp(s1&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;c));<br />&nbsp;&nbsp;&nbsp;&nbsp;d2&nbsp;=&nbsp;DblCmp(s2&nbsp;=&nbsp;Cross(a,&nbsp;b,&nbsp;d));<br />&nbsp;&nbsp;&nbsp;&nbsp;d3&nbsp;=&nbsp;DblCmp(s3&nbsp;=&nbsp;Cross(c,&nbsp;d,&nbsp;a));<br />&nbsp;&nbsp;&nbsp;&nbsp;d4&nbsp;=&nbsp;DblCmp(s4&nbsp;=&nbsp;Cross(c,&nbsp;d,&nbsp;b));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;e,&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;e.fX&nbsp;=&nbsp;a.fX&nbsp;-&nbsp;b.fX;<br />&nbsp;&nbsp;&nbsp;&nbsp;e.fY&nbsp;=&nbsp;a.fY&nbsp;-&nbsp;b.fY;<br />&nbsp;&nbsp;&nbsp;&nbsp;f.fX&nbsp;=&nbsp;c.fX&nbsp;-&nbsp;d.fX;<br />&nbsp;&nbsp;&nbsp;&nbsp;f.fY&nbsp;=&nbsp;c.fY&nbsp;-&nbsp;d.fY;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(DblCmp(Det(e.fX,&nbsp;e.fY,&nbsp;f.fX,&nbsp;f.fY))&nbsp;==&nbsp;0)<span style="color: #008000; ">//</span><span style="color: #008000; ">2个向量共线</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(d1&nbsp;*&nbsp;d2&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;d3&nbsp;*&nbsp;d4&nbsp;&gt;&nbsp;0)<span style="color: #008000; ">//</span><span style="color: #008000; ">不在同一条直线上</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">2条直线相交</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;p.fX&nbsp;=&nbsp;(c.fX&nbsp;*&nbsp;s2&nbsp;-&nbsp;d.fX&nbsp;*&nbsp;s1)&nbsp;/&nbsp;(s2&nbsp;-&nbsp;s1);<br />&nbsp;&nbsp;&nbsp;&nbsp;p.fY&nbsp;=&nbsp;(c.fY&nbsp;*&nbsp;s2&nbsp;-&nbsp;d.fY&nbsp;*&nbsp;s1)&nbsp;/&nbsp;(s2&nbsp;-&nbsp;s1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">freopen("out.txt",&nbsp;"w",&nbsp;stdout);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("INTERSECTING&nbsp;LINES&nbsp;OUTPUT\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf%lf%lf",&nbsp;&amp;beg[0].fX,&nbsp;&amp;beg[0].fY,&nbsp;&amp;end[0].fX,&nbsp;&amp;end[0].fY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf%lf%lf",&nbsp;&amp;beg[1].fX,&nbsp;&amp;beg[1].fY,&nbsp;&amp;end[1].fX,&nbsp;&amp;end[1].fY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nRet&nbsp;=&nbsp;SegCross(beg[0],&nbsp;end[0],&nbsp;beg[1],&nbsp;end[1],&nbsp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nRet&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("NONE\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nRet&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("POINT&nbsp;%.2f&nbsp;%.2f\n",&nbsp;p.fX,&nbsp;p.fY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("LINE\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("END&nbsp;OF&nbsp;OUTPUT\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/183895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-17 15:20 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/17/183895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj 2653 Pick-up sticks</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/07/15/183561.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Sun, 15 Jul 2012 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/07/15/183561.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/183561.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/07/15/183561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/183561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/183561.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;这是一个计算几何的题目。题意是，按顺序给一系列的线段，问最终哪些线段处在顶端。<br />&nbsp; &nbsp;只需要穷举判断，当前的线段会与哪些线段有交点即可。也就是暴力求解，但是线段数目N有10的5次方，平方算法是不能过的。这个题<br />能过的原因是题目描述里面说了，top的stick不会超过1000个。那么修改下暴力的方式题目就能过了。<br />&nbsp; &nbsp;从小到大枚举每个棍子，判断它是否与后面的棍子相交，如果相交直接把当前棍子的top属性置为false，然后break内层循环。这样就不<br />会超时了，暴力也是需要技巧的，这句话说的很对啊。<br />&nbsp; &nbsp;判断2条线段是否相交的算法直接按照黑书上的模板代码写了，那个模板代码还不错吧。。。<br /><br />&nbsp; &nbsp;代码如下：<br />&nbsp; &nbsp;<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><div>#include&nbsp;&lt;stdio.h&gt;</div>#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>.h&gt;<br />#include&nbsp;&lt;math.h&gt;<br /><span style="color: #0000FF; ">#define</span>&nbsp;MAX_N&nbsp;(100000&nbsp;+&nbsp;10)<br /><span style="color: #0000FF; ">struct</span>&nbsp;POS<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY;<br />};<br /><br />POS&nbsp;begs[MAX_N],&nbsp;ends[MAX_N];<br /><span style="color: #0000FF; ">bool</span>&nbsp;bAns[MAX_N];<br /><span style="color: #0000FF; ">int</span>&nbsp;nN;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fPrecision&nbsp;=&nbsp;1e-8;<br /><br /><span style="color: #0000FF; ">double</span>&nbsp;Det(<span style="color: #0000FF; ">double</span>&nbsp;fX1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY1,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fX2,&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;fY2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fX1&nbsp;*&nbsp;fY2&nbsp;-&nbsp;fX2&nbsp;*&nbsp;fY1;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">以a作为公共点,计算叉积</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">double</span>&nbsp;Cross(POS&amp;&nbsp;a,&nbsp;POS&amp;&nbsp;b,&nbsp;POS&amp;&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Det(b.fX&nbsp;-&nbsp;a.fX,&nbsp;b.fY&nbsp;-&nbsp;a.fY,&nbsp;c.fX&nbsp;-&nbsp;a.fX,&nbsp;c.fY&nbsp;-&nbsp;a.fY);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;DblCmp(<span style="color: #0000FF; ">double</span>&nbsp;fD)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(fabs(fD)&nbsp;&lt;&nbsp;fPrecision)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fD&nbsp;&gt;&nbsp;0&nbsp;?&nbsp;1&nbsp;:&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><span style="color: #008000; ">//<br /></span><span style="color: #0000FF; ">bool</span>&nbsp;IsSegCross(<span style="color: #0000FF; ">int</span>&nbsp;nI,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nJ)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(DblCmp(Cross(begs[nI],&nbsp;ends[nI],&nbsp;begs[nJ]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;DblCmp(Cross(begs[nI],&nbsp;ends[nI],&nbsp;ends[nJ])))&nbsp;==&nbsp;-2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;(DblCmp(Cross(begs[nJ],&nbsp;ends[nJ],&nbsp;begs[nI]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^&nbsp;DblCmp(Cross(begs[nJ],&nbsp;ends[nJ],&nbsp;ends[nI])))&nbsp;==&nbsp;-2;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(scanf("%d",&nbsp;&amp;nN),&nbsp;nN)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%lf%lf%lf%lf",&nbsp;&amp;begs[i].fX,&nbsp;&amp;begs[i].fY,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;ends[i].fX,&nbsp;&amp;ends[i].fY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(bAns,&nbsp;<span style="color: #0000FF; ">true</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(bAns));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">暴力也是需要技巧的</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;i&nbsp;+&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;nN;&nbsp;++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(IsSegCross(i,&nbsp;j))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bAns[i]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Top&nbsp;sticks:");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bPre&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;nN;&nbsp;++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bAns[i])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bPre)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(",");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bPre&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;%d",&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(".\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/183561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-07-15 17:06 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/07/15/183561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>