hdu6127+极角排序+计算几何

题意

1
给定n个点,每个点有权值,线段的权值是点权值之积。现在化一条直线,使得与它相交线段的权值最大!!

题解

1
2
简单题:极角排序+扫描就行了!!!
以y为中心的

总结

1
2


code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
#include<math.h>
#define sum first
#define id second
#define PI (cos(-1))
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int Maxn = 500005;
const double eps=1e-8;
int (double x)
{
if(fabs(x)<eps) return 0;
return x>0?1:-1;
}
struct node{
double x,y,thera,val;
bool operator <(const node &t)const
{
return thera<t.thera;
}
}po[Maxn];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf",&po[i].x,&po[i].y,&po[i].val);
if(po[i].x==0) po[i].thera=PI/2.0;
else po[i].thera=atan(po[i].y/po[i].x);
}
sort(po+1,po+n+1);
ll rsum=0,lsum=0;
for(int i=1;i<=n;i++)
{
if(dcmp(po[i].x)>=0) rsum+=po[i].val;
else lsum+=po[i].val;
}
ll ans=lsum*rsum;
for(int i=1;i<=n;i++)
{
if(po[i].x>=0) rsum-=po[i].val,lsum+=po[i].val;
else rsum+=po[i].val,lsum-=po[i].val;
ans=max(ans,lsum*rsum);
}
printf("%lldn",ans);
}
return 0;
}
以x为中心的
**************************************************
#include<bits/stdc++.h>
#define N 50006
using namespace std;
const double pi=acos(-1.0);
struct point
{
long long x,y,v;
bool flag;
}a[N];
bool cmp(point b,point c)
{
double xx,yy;
xx=atan2((double)b.y,(double)b.x);
yy=atan2((double)c.y,(double)c.x);
return xx<yy;
}
int main()
{
int t,n;
long long sum1=0,sum2=0;
scanf("%d",&t);
while(t--)
{
sum1=0,sum2=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].v);
if(a[i].y<0)
{
sum1+=a[i].v;
a[i].x*=-1;
a[i].y*=-1;
a[i].flag=false;
}
else a[i].flag=true,sum2+=a[i].v;
}
sort(a,a+n,cmp);
long long ans=sum1*sum2;
for(int i=0;i<n;i++)
{
if(a[i].flag)
{
sum2-=a[i].v;
sum1+=a[i].v;
}
else
{
sum1-=a[i].v;
sum2+=a[i].v;
}
ans=max(ans,sum1*sum2);
}
cout<<ans<<endl;
}
return 0;
}