hdu6127 Hard challenge

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6127

题目:

Hard challenge

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 813    Accepted Submission(s): 329

Problem Description

There are n points on the plane, and the ith points has a value vali, and its coordinate is (xi,yi). It is guaranteed that no two points have the same coordinate, and no two points makes the line which passes them also passes the origin point. For every two points, there is a segment connecting them, and the segment has a value which equals the product of the values of the two points. Now HazelFan want to draw a line throgh the origin point but not through any given points, and he define the score is the sum of the values of all segments that the line crosses. Please tell him the maximum score.

Input

The first line contains a positive integer T(1≤T≤5), denoting the number of test cases.
For each test case:
The first line contains a positive integer n(1≤n≤5×104).
The next n lines, the ith line contains three integers xi,yi,vali(|xi|,|yi|≤109,1≤vali≤104).

Output

For each test case:
A single line contains a nonnegative integer, denoting the answer.

Sample Input

2
2
1 1 1
1 -1 1
3
1 1 1
1 -1 10
-1 0 100

Sample Output

1
1100

Source

2017 Multi-University Training Contest - Team 7

思路:极角排序后扫描线

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define MP make_pair
 6 #define PB push_back
 7 typedef long long LL;
 8 typedef pair<int,int> PII;
 9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13
14 struct Point
15 {
16     LL x,y,v;
17 }pt[K],st;
18 LL cross(const Point &po,const Point &ps,const Point &pe)
19 {
20     return (ps.x-po.x)*(pe.y-po.y)-(pe.x-po.x)*(ps.y-po.y);
21 }
22 bool cmp(const Point &ta,const Point &tb)
23 {
24     return cross(st,ta,tb)>0;
25 }
26 int main(void)
27 {
28     int t,n;cin>>t;
29     while(t--)
30     {
31         int se;
32         LL s1=0,s2=0,ans=0,mx=0;
33         scanf("%d",&n);
34         for(int i=0;i<n;i++)
35         {
36             scanf("%lld%lld%lld",&pt[i].x,&pt[i].y,&pt[i].v);
37             pt[i+n].x=-pt[i].x;
38             pt[i+n].y=-pt[i].y;
39             pt[i+n].v=0;
40             s2+=pt[i].v;
41         }
42         if(n==1) {printf("0\n");continue;}
43         sort(pt,pt+2*n,cmp);
44         s1+=pt[0].v;
45         for(int i=1;i<2*n;i++)
46         if(cross(st,pt[0],pt[i])<0)
47         {
48             se=i-1;break;
49         }
50         else
51             s1+=pt[i].v;
52         s2-=s1;
53         mx=ans=s1*s2;
54         for(int i=1,r=se;i<se;i++)
55         {
56             ans+=-pt[i].v*s2+(s1-pt[i].v)*pt[i].v;
57             s2+=pt[i].v,s1-=pt[i].v;
58             while(r+1<2*n&&cross(st,pt[i],pt[r+1])>=0)
59             {
60                 r++;
61                 ans+=-pt[r].v*s1+(s2-pt[r].v)*pt[r].v;
62                 s1+=pt[r].v,s2-=pt[r].v;
63             }
64             mx=max(mx,ans);
65         }
66         printf("%lld\n",mx);
67     }
68     return 0;
69 }
时间: 2024-10-11 00:10:27

hdu6127 Hard challenge的相关文章

【极角排序】【扫描线】hdu6127 Hard challenge

平面上n个点,每个点带权,任意两点间都有连线,连线的权值为两端点权值之积.没有两点连线过原点.让你画一条过原点直线,把平面分成两部分,使得直线穿过的连线的权值和最大. 就把点极角排序后,扫过去,一侧的点会跨过直线与另一侧的所有点形成连线.此时的答案为两侧的权值和之积,尝试用此更新最终答案. #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; struct Point{ ll

securityoverridehacking challenge 解题思路汇总——JavaScript

通过了Advanced部分( securityoverridehacking challenge 解题思路汇总--Advanced),下面就进入JavaScript了.总的来说,这个部分比较简单,因为JavaScript是高度可控的东西.也就是说,安全角度而言,JavaScript是不可信的. 4        Javascript 4.1       Login Bypass 这题比较容易让人想多,逛了下hint,发现很简单.观察,首先请求了index.php,然后跳转到了fail.php,并

2292: 【POJ Challenge 】永远挑战

2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 230[Submit][Status][Discuss] Description lqp18_31和1tthinking经常出题来虐ftiasch.有一天, lqp18_31搞了一个有向图,每条边的长度都是1. 他想让ftiasch求出点1到点 N 的最短路."水题啊.", ftiasch这么说道. 所以1tth

Codechef July Challenge 2014部分题解

Dish Owner(并查集) 链接:http://www.codechef.com/JULY14/problems/DISHOWN/ 题意分析:本题主要操作就是给出0 x y时,拥有第x道菜的厨师与拥有第y道菜的厨师pk,谁拥有的所有菜的其中一道菜(不一定是x或y)的分值比较高谁就获胜,并赢得loser的所有菜.即比较的是每个人分值最高的菜,所以对于非loser的人来说,他的分值最高的菜是不变的.综合题意用并查集易解. #include <cstdio> const int Maxn=100

东方14ACM小组 15:Challenge 11

Challenge 11 查看 提交 统计 提问 总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求某次操作后连续一段的和 输入 第一行两个正整数N和M.第二行N的整数表示这个数列.接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的数修改为y:若该字符为'Q',则表示一个询问操作,接下来三个整

12:Challenge 5(线段树区间直接修改)

总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)将某连续一段同时改成一个数 (2)求数列中某连续一段的和 输入 第一行两个正整数N和M.第二行N的整数表示这个数列.接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来三个整数x.y和z,表示在[x,y]这段区间的数改为z:若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示求[x,y]这段

Python Challenge——T2

想起来之前在学校论坛上看到大神推荐的一款python游戏 Python Challenge,于是做了几道题,还很有意思. 这是第二题,先放链接:http://www.pythonchallenge.com/pc/def/map.html 题目如下: 还有两段文字提示: everybody thinks twice before solving this. g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bm

Python Challenge 6

第6关: 既然下面的与riddle没有关系,那就不要管了啦,想哥什么时候有钱了再汇给你呗.现在还只是工科屌丝一枚. 看上面,除了一个注释<!--zip-->就没了,拉进url一试,yes, find the zip. 压缩文件,再拉一个channel.zip就弄出来了. 剩下的与第5关类似. the next nothing is ... import urllib import urllib.request import zipfile import os import os.path im

HMAC在“挑战/响应”(Challenge/Response)身份认证的应用

HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中. 认证流程 (1) 先由客户端向服务器发出一个验证请求. (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战). (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应). (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,