HDU 6127: Hard challenge

Hard challenge

#include<bits/stdc++.h>typedef long long L;using namespace std;#define endl ‘\n‘const int MAXN=5*1e4+5;struct Point{    int x,y,val;}p[MAXN];bool cmp(const Point &x,const Point &y){    if(x.x==0)return true;    if(y.x==0)return false;    return x.y/(double)x.x>=y.y/(double)y.x;}int main(){    ios::sync_with_stdio(false);    cin.tie(0);    int T;    cin>>T;    while(T--)    {        int n;        cin>>n;        for(int i=0;i<n;i++)cin>>p[i].x>>p[i].y>>p[i].val;        sort(p,p+n,cmp);        L sum1=0,sum2=0,ans=0;        for(int i=0;i<n;i++)        {            if(p[i].x<0||(p[i].x==0&&p[i].y<0))sum1+=p[i].val;            else sum2+=p[i].val;        }        for(int i=0;i<n;i++)        {            if(p[i].x<0||(p[i].x==0&&p[i].y<0))            {                sum1-=p[i].val;                sum2+=p[i].val;            }            else            {                sum1+=p[i].val;                sum2-=p[i].val;            }            ans=max(ans,sum1*sum2);        }        cout<<ans<<endl;    }    return 0;} 
时间: 2024-10-17 03:48:24

HDU 6127: Hard challenge的相关文章

【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线段两端点点权的乘积 现在要过原点作一条直线,要求这条直线不经过任意一个给定的点 在所有n个点两两连成的线段中,计算与这条直线有交点的线段的权值和 最大化这个权值和并输出 题目保证,给定的n个点不重合且任意两个点的连线不经过原点 [思路] 一条经过原点的直线把n个点分成两个半平面A,B 假设A中的点权

hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)

题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原来(-pi,pi]区间的元素copy到(pi,3pi],用双指针维护一个角度差不超过pi的区间,记区间的权值和为sum1,用sum1*(sum-sum)更新ans #include<bits/stdc++.h> using namespace std; typedef long long LL;

HDU 6127 Hard challenge (极角扫描)

题意:给定 n 个点,和权值,他们两两相连,每条边的权值就是他们两个点权值的乘积,任意两点之间的直线不经过原点,让你从原点划一条直线,使得经过的直线的权值和最大. 析:直接进行极角扫描,从水平,然后旋转180度,就可以计算出一个最大值,因为题目说了任意直线不是经过原点的,所以就简单了很多,每次碰到的肯定是一个点,而不是多个点. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdi

hdu 6127

http://acm.hdu.edu.cn/showproblem.php?pid=6127 题意:有N个点,每一个点都有一个权值,每两点可以组成一条边,每一个边的权值为两点的权值相乘,然后求一条直线可以穿过权值和最多的边为多少 思路:枚举,枚举每一个点与原点连成的直线,把所有的点分成两半,它的权值和就是两边的总和相乘. 根据极角进行排序,排序完后可以把这些点分为两部分,a部分的x是大于0的值的和,b部分的x是小于0的值的和,依次遍历这个序列,如果当前序列的点是大于0的,那么这个点可以 从a移到

第十场 hdu 6172 Array Challenge(矩阵快速幂)

http://acm.hdu.edu.cn/showproblem.php?pid=6172 题目大意:按照给出的公式算出an 解题思路:an=4an-1+17an-2-12an-3,不要问我为什么,我也不知道(?_?) AC代码: 1 #include <iostream> 2 #include<bits/stdc++.h> 3 //if(~i)//当i不是-1时满足条件 4 using namespace std; 5 const int SMod=1e9+7; 6 struc

2017多校第10场 HDU 6172 Array Challenge 猜公式,矩阵幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6172 题意:如题. 解法: #include <bits/stdc++.h> using namespace std; typedef long long LL; const LL mod = 1e9+7; struct Matrix{ LL a[3][3]; void set1(){ memset(a, 0, sizeof(a)); } void set2(){ memset(a, 0, siz

HDU - 6172:Array Challenge (BM线性递推)

题意:给出,三个函数,h,b,a,然后T次询问,每次给出n,求sqrt(an); 思路:不会推,但是感觉a应该是线性的,这个时候我们就可以用BM线性递推,自己求出前几项,然后放到模板里,就可以求了. 数据范围在1e15,1000组都可以秒过. 那么主要的问题就是得确保是线性的,而且得求出前几项. #include<bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per

HDU多校2017第7场

6121 Build a tree 6125 Free from square 6126 Give out candies 6127 Hard challenge 6128 Inverse of sum 6129 Just do it 对于变换$m$次之后的序列,考虑$a_0$对$a_i(0 \le i < n)$的贡献,为$C_{m-1+i}^i$个$a_0$相异或的结果.同样地,$a_1$对$a_{i+1}(0 \le i<n-1)$的贡献也为$C_{m-1+i}^i$.然后,组合数判定奇

hdu 6127---Hard challenge(思维)

题目链接 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