[hdu-4946] Area of Mushroom 计算几何 凸包

大致题意:

  平面上有n个人,给你每个人的坐标和一个速度v,如果某个人比其他所有人都先到达某点,则该点就被这个人掌控,求谁掌控者无限大的面积。

  首先 速度最大的人,抛弃其他人,速度小的人必定无法得到无限的面积。

  然后 所有速度最大的人建凸包,则凸包上节点的人和凸包边上的人必定有无限的面积,凸包内部的人必定没有,因为速度都相等。

    ps:建凸包时不能直接将叉积的<=该为<来构建边上有点的凸包,因为有重点。

  最后将所有得到的人中有重合的全部去除,最后留下的人掌控的面积无限

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<cstdlib>
#include<cmath>
#include<list>
using namespace std;
#define MAXN 100100
#define eps 1e-9
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Fore(i,a,b) for(int i=a;i>=b;i--)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mkp make_pair
#define pb push_back
#define cr clear()
#define sz size()
#define met(a,b) memset(a,b,sizeof(a))
#define iossy ios::sync_with_stdio(false)
#define fre freopen
#define pi acos(-1.0)
#define inf 1e6+7
#define Vector Point
const int Mod=1e9+;
typedef unsigned long long ull;
typedef long long ll;
int dcmp(double x){
if(fabs(x)<=eps) return ;
return x<?-:;
}
struct Point{
double x,y;
int v;
int id;
Point(double x=,double y=):x(x),y(y) {}
bool operator < (const Point &a)const{
if(x==a.x && y==a.y) return v<a.v;
if(x==a.x) return y<a.y;
return x<a.x;
}
Point operator - (const Point &a)const{
return Point(x-a.x,y-a.y);
}
Point operator + (const Point &a)const{
return Point(x+a.x,y+a.y);
}
Point operator * (const double &a)const{
return Point(x*a,y*a);
}
Point operator / (const double &a)const{
return Point(x/a,y/a);
}
void read(){
scanf("%lf%lf",&x,&y);
scanf("%d",&v);
}
void out(){
cout<<"debug: "<<x<<" "<<y<<endl;
}
bool operator == (const Point &a)const{
return dcmp(x-a.x)== && dcmp(y-a.y)==;
}
bool operator !=(const Point &a)const{
return dcmp(x-a.x)!= || dcmp(y-a.y)!=;
}
};
double Dot(Vector a,Vector b) {
return a.x*b.x+a.y*b.y;
}
double dis(Vector a) {
return Dot(a,a);
}
double Cross(Point a,Point b){
return a.x*b.y-a.y*b.x;
}
bool cmp(Point a,Point b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int vt[];
int ConvexHull(Point *p,int n,Point *ch,int maxv){
sort(p,p+n,cmp);
int m=;
for(int i=;i<n;i++){
while(m> && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;i--){
while(m>k && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
ch[m++]=p[i];
}
if(n>) m--;
return m;
}
int n;
Point p[];
Point ch[];
Point pp[];
char s[];
void solve(){
met(vt,);
int maxv=;
s[n]='\0';
int rt=;
For(i,,n-) s[i]='';
For(i,,n-) p[i].read(),p[i].id=i;
sort(p,p+n);
For(i,,n-) {
if(p[i]==p[i-] && p[i].v==p[i-].v) vt[p[i].id]=,vt[p[i-].id]=;
}
For(i,,n-) maxv=max(maxv,p[i].v);
For(i,,n-) if(p[i].v==maxv) pp[rt++]=p[i];
if(maxv==){
puts(s);
return ;
}
int m=ConvexHull(pp,rt,ch,maxv);
For(i,,m-){
if(!vt[ch[i].id]) s[ch[i].id]='';
}
For(i,,rt-) {
// cout<<"Bug: "<<pp[i].id<<" "<<vt[pp[i].id]<<endl;
// pp[i].out();
For(j,,m-){
if(dcmp(Cross(ch[j]-pp[i],ch[(j+)%m]-pp[i]))== && !vt[pp[i].id]) {s[pp[i].id]='';break;}
}
}
puts(s);
}
int main(){
// fre("in.txt","r",stdin);
int t=;
while(~scanf("%d",&n) && n) printf("Case #%d: ",++t),solve();
return ;
}
上一篇:Servlet连接数据库


下一篇:Lua与C的交互