标签:des style class blog c code
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 9955 | Accepted: 4754 |
Description
Input
Output
Sample Input
5 6 0 10 60 0 3 1 4 3 6 8 10 10 15 30 1 5 2 1 2 8 5 5 40 10 7 9 4 10 0 10 100 0 20 20 40 40 60 60 80 80 5 10 15 10 25 10 35 10 45 10 55 10 65 10 75 10 85 10 95 10 0
Sample Output
0: 2 1: 1 2: 1 3: 1 4: 0 5: 1 0: 2 1: 2 2: 2 3: 2 4: 2
Hint
Source
题目大意:
第一行n,m,x1,x2,y1,y2,表示有个玩具收纳盒被n个线段分为n+1块,编号依次是0,1,2....n,这个收纳盒的左上角坐标是x1,y1,右下角是x2,y2,接下来n行u0,l0,是指给你这些线段的坐标,(u0,y1)与(l0,y2) ,紧接着是m行,表示玩具的坐标,问你每一块玩具的个数
解题思路:
利用二分求出玩具所在哪一块,因为在左边或者在右边,满足单调性,利用叉积算出在左边还是右边。
解题代码:
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int maxn=5100;
struct point{
int x,y;
point(int x0=0,int y0=0){
x=x0;y=y0;
}
int xchen(point a,point b){//pa*pb
int x1=a.x-x,y1=a.y-y,x2=b.x-x,y2=b.y-y;
return x1*y2-x2*y1;
}
};
struct line{
point p1,p2;
line(point p10,point p20){
p1=p10;p2=p20;
}
};
int n,m,ans[maxn];
vector <line> v;
void input(){
v.clear();
int x1,y1,x2,y2,u0,l0;
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=0;i<=n;i++) ans[i]=0;
for(int i=0;i<n;i++){
scanf("%d%d",&u0,&l0);
v.push_back(line(point(u0,y1),point(l0,y2)));
}
}
void solve(){
point p;
for(int i=0;i<m;i++){
scanf("%d%d",&p.x,&p.y);
if( (v[0].p1).xchen(v[0].p2,p) < 0 ) ans[0]++;
else if( (v[n-1].p1).xchen(v[n-1].p2,p) > 0 ) ans[n]++;
else{
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
if( (v[mid].p1).xchen(v[mid].p2,p) > 0 ) l=mid+1;
else r=mid;
}
ans[r]++;
}
}
for(int i=0;i<=n;i++){
printf("%d: %d\n",i,ans[i]);
}
}
int main(){
int casen=0;
while(scanf("%d",&n)!=EOF && n!=0){
input();
casen++;
if(casen>1) printf("\n");
solve();
}
return 0;
}
标签:des style class blog c code
原文地址:http://blog.csdn.net/a1061747415/article/details/26263185