题意也就是:一个矩形被n条线段分成n+1份,每条线段各不相交,给出几个点落在矩形内部,问各个部分有几个点。
由于各个部分各不相交,线段的上、下端点也就排好序了,然后二分查找每个点落在线段左边的第一条线段,也就找出了落点的区域。
#include#include #include using namespace std; int upLine[5001],lowLine[5001],res[5001],up,low,Left,Right; int IsLeft(int x,int y,int k) { return (upLine[k]-lowLine[k])*(y-low)>(x-lowLine[k])*(up-low); } int load(int x,int y,int n) { int mid,i,j; i=0;j=n; while(i >1; if(IsLeft(x,y,mid)) j=mid; else i=mid+1; } return i-1; } int main() { int n,m,i,s,k,w; while(scanf("%d",&n) && n) { memset(res,0,sizeof(res)); scanf("%d %d %d %d %d",&m,&Left,&up,&Right,&low); upLine[0]=lowLine[0]=Left; for(i=1;i<=n;i++) { scanf("%d %d",&upLine[i],&lowLine[i]); } upLine[n+1]=lowLine[n+1]=Right; for(i=0;i