二分+叉积 apio2011 陈可卿 计算几何的一道简单题 poj2318 兼集训总结

这两天是省选,作为高一实在没什么竞争力,但奥特曼依旧杀入省队。

apio讲这道题的时候,我一下灵光一闪,想到了二分,之前除了在nlogn的最长上升子序列用过一次,就再也没用过,只知道跟单调性有关,apio时一见这道题便突然明白二分和单调性的关系。

跟二分颇有缘分,集训时碰到一道二分+三分+凸包+线段交点的恶心计算几何,还有一道二分+动规检验的题,然后翻syj(进省队的那位)博客时又看到一篇关于思维的blog,其中举二分为例说明,省选时看到某个题又有了二分检验的冲动,结果发现是水题,我们高一几乎全a了,现在在改数据。。。总之,这道很久以前我就想做的一道题被我一A了。

二分不但是具有优秀时间复杂度的方法,更是简化问题的思路,syj的blog就有提到,但我们既要培养某种特定的思维习惯,又不能被这种思维所禁锢,关键是把握好自己的思想,知道我为什么在这里。不过我才刚刚起步,论掌握的算法,我自认为学到的不算少,但我缺乏自主思考的习惯,一碰到某个题,我就不由自主的去翻结题报告,还总期望遇到自己做过的类型题(还确实被我遇到过),但每每实战中,总无法自主的拨开问题的迷雾,创造自己的算法,这点与罗雨屏恰好相反,每每他都能把握问题的实质,纵观高一难有人与他媲美,陈文潇虽然有时也表现出非凡能力,但仅限于数论方面,而我对于图论虽然执着而敏感,但真正自主看破问题的次数是屈指可数。

从现在开始,不但要更加努力的学习各种算法,更要培养自己思考问题的能力。

虽然我不想说雅礼坏话,但据说一试第一、四题,雅礼都做过,而我们涛哥出的题难得要死,正好卡了我们一个高二的,而且一试前七清一色雅礼,还有一个高一,据某同学爆料,有两个雅礼高一连文件输入输出都不会,拿到第一题直接画个矩阵开始敲。以上属于道听途说,不代表本人感情色彩(我还有一个好朋友在雅礼)。

目前最要紧的,还是尽快提高自身实力。

type line=record x1,y1,x2,y2:longint end; point=record x,y:longint end; var n,m:longint; ans:array[0..5000]of longint; a:point; b:array[0..5001]of line; function cross(x:line;p0:point):longint; begin cross:=(x.x2-x.x1)*(p0.y-x.y1)-(p0.x-x.x1)*(x.y2-x.y1) end; procedure search(a:point); var l,r,mid:longint; begin l:=0;r:=n+1; while l<=r do begin mid:=(l+r)>>1; if cross(b[mid],a)<0 then l:=mid+1 else r:=mid-1 end; inc(ans[l-1]) end; procedure init; var i,x1,x2,y1,y2,x,y:longint; begin fillchar(b,sizeof(b),0); fillchar(ans,sizeof(ans),0); read(n); if n=0 then exit; readln(m,x1,y1,x2,y2); b[0].x1:=x1;b[0].y1:=y2;b[0].x2:=x1;b[0].y2:=y1; b[n+1].x1:=x2;b[n+1].y1:=y2;b[n+1].x2:=x2;b[n+1].y2:=y1; for i:=1 to n do begin readln(x,y); b[i].x1:=y;b[i].y1:=y2; b[i].x2:=x;b[i].y2:=y1 end; for i:=1 to m do begin readln(a.x,a.y); search(a); end; for i:=0 to n do writeln(i,': ',ans[i]); writeln end; begin assign(input,'2318.in');reset(input); while not(seekeof) do init; close(input) end.  

 

你可能感兴趣的:(二分+叉积 apio2011 陈可卿 计算几何的一道简单题 poj2318 兼集训总结)