hdu6127
来源:互联网 发布:剑三藏剑叶英脸型数据 编辑:程序博客网 时间:2024/05/22 13:27
题目大意
平面上有n个点,每个点有一个价值,每两个点之间都有一条线段,定义线段的值为两个点价值的乘积,现在让你找一条过原点的直线(直线不经过任何一个节点),将这条直线所经过的所有线段的值求和,问最大的和是多少.
分析
我们容易知道如果确定了直线的位置,那么将直线两边的点分别求和再乘起来就是答案
那么现在只需要枚举直线的位置即可,只有当直线扫过点的时候值才会发生变化,所以我们离散化地取枚举每个节点,在跨过节点的时候只需要
O(1) 的复杂度就能对答案进行更新。代码
#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<queue>#include<map>#include<algorithm>#include<set>#include<stack>using namespace std;#define LL long long intconst double pi=4*atan(1.0);const int MAXN=50009;int T;int n;LL sum_up,sum_down;struct Node{ int x,y,v; double r; bool is_up;//1表示在x轴上面}node[MAXN];double Get_r(int x,int y)//给定一个点的坐标,如果这个点在x轴上方,返回这个点和原点连线与轴正方向的夹角。如果这个点在x轴下方,返回这个点和原点连线与轴负方向的夹角{ if(x==0)return pi; if(y==0)return 0; if(x<0 && y>0)return pi-atan(-(double)y/(double)x); if(x>0 && y<0)return pi-atan(-(double)y/(double)x); return atan((double)y/(double)x);}bool Get_up(int x,int y)//判断一个节点在x轴上方还是下方,在x轴上的点正方向归为下方,负方向归为上方{ if(y>0)return 1; else if(y<0)return 0; else { if(x<0)return 1; else return 0; }}bool cmp(Node a,Node b){ return a.r < b.r;}void In(){ sum_up=sum_down=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].v); if(node[i].x==0 && node[i].y==0)node[i].v=0; node[i].r=Get_r(node[i].x,node[i].y); node[i].is_up=Get_up(node[i].x,node[i].y); if(node[i].is_up==1)sum_up+=node[i].v; else sum_down+=node[i].v; }}LL Work(){ LL ans=sum_up*sum_down; double cur_r=0; int i=1; while(node[i].r==0)i++; while(i<=n) { cur_r=node[i].r; while(node[i].r==cur_r) { if(node[i].is_up==1) { sum_up-=node[i].v; sum_down+=node[i].v; } else { sum_up+=node[i].v; sum_down-=node[i].v; } i++; } ans=max(ans,sum_down*sum_up); } return ans;}void Test(){ cout<<"sum_up="<<sum_up<<",sum_down="<<sum_down<<endl; for(int i=1;i<=n;i++)cout<<node[i].is_up<<" "; cout<<endl;}int main(){ scanf("%d",&T); while(T--) { In(); //Test(); sort(node+1,node+n+1,cmp); cout<<Work()<<endl; }}/*221 1 11 -1 131 1 11 -1 10-1 0 100141 0 40 1 50 -1 3-2 0 6*/
- 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
- 117
- 118
- 119
- 120
- 121
- 122
- 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
- 117
- 118
- 119
- 120
- 121
- 122
阅读全文
0 0
- hdu6127
- hdu6127 思维
- hdu6127 Hard challenge
- hdu6127-(数学+暴力)
- HDU6127-Hard challenge
- hdu6127 Hard challenge
- 第七次多校联合hdu6127
- Hard challenge(HDU6127)
- HDU6127-Hard challenge
- HDU6127-Hard challenge
- HDU6127-Hard challenge
- HDU6127(极角排序)
- HDU6127 Hard challenge【几何】
- Hard challenge(hdu6127)
- HDU6127 Hard challenge[计算几何]
- HDU6127 Hard challenge 极角排序|暴力
- Hdu6127 Hard challenge(2017多校第7场)
- hdu6127 (多校联合第七场) 几何 枚举
- oracle dba 日常必备sql
- 《Tableau数据可视化从入门到精通》之序言
- kafka基本操作命令总结以及Kafka界面化管理链接
- 交互式QGraphicsView(平移/缩放/旋转)
- js常用的字符串方法分析
- hdu6127
- QGesture
- 数据挖掘笔试题
- ubuntu16.04 下 使用update-alternatives 更换python 版本
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常(2)
- linux Boot目录满了之后的解决方法
- sed参数是变量,变量中有特殊字符,如何处理
- 【CUGBACM15级BC第六场 B】hdu 4982 Goffi and Squary Partition
- Matlab中的sum函数以及sum(,3)求和函数