【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6127

【Description】



平面上有n个点,每个点有一个价值,每两个点之间都有一条线段,定义线段的值为两个点价值的乘积,现在让你找一条过原点的直线(直线不经过任何一个节点),将这条直线所经过的所有线段的值求和,问最大的和是多少.

【Solution】



假设有一条线把x轴上方和x轴下方的点分开了;

这样这条线的答案就为(val上1+val上2+…+val上n)*(val下1+val下2+…+val下n);

把上边的点的权值加起来,下边的点的权值也加起来.然后做下乘法就好.

之后,我们只要一点一点地逆时针旋转这条直线就好了;

每次遇到的第一个点,就改变上半部分删掉它之后权值的改变量;

在所有里面取最大值即可;

在转的时候,不管是直线的哪一个地方,只要遇到了一个点就停下来;

然后计算改变量.

如果是在x轴的下方的点的话,就是从直线的下方变成上方.

如果是在x轴的上方…

遇到的是哪一点并不好判断!

于是,我们考虑把x轴下方的点按原点对称到上方来.

(记录它原来是下方的);

这样,我们只要按照角升序排一下.

然后顺序处理,就能知道下一个会遇到的点是哪一个点了.

因为不存在两点经过原点,所以不会出现重复点.

虽然我们把它翻到了x轴上方,但我们在处理的时候,还是在原图上基础上处理的,即每个点转到之后和直线的位置关系

只不过能更清楚的知道下一个遇到的点是什么



【NumberOf WA】



0



【Reviw】



老是重新算很麻烦,就尝试一步一步地改变.



【Code】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 5e4; struct abc{
LL x,y,val;
int tag;
double c;
friend bool operator < (const abc &a,const abc &b){
return a.c > b.c;
}
}; int n;
abc a[N+10]; LL sqr(LL x){
return x*x;
} int main(){
//Open();
//Close();
int T;
ri(T);
while (T--){
ri(n);
rep1(i,1,n){
rl(a[i].x),rl(a[i].y),rl(a[i].val);
if (a[i].y < 0){
a[i].tag = 0;
a[i].x = - a[i].x;
a[i].y = - a[i].y;
}else
a[i].tag = 1;
a[i].c = 1.0*a[i].x/(1.0*sqrt((double)(sqr(a[i].x)+sqr(a[i].y))));
} sort(a+1,a+1+n); LL s0 = 0,s1 = 0,temp = 0,ans;
rep1(i,1,n){
if (a[i].tag==0)
s0 += a[i].val;
else
s1 += a[i].val;
} rep1(i,1,n)
if (a[i].tag == 1)
temp += s0*a[i].val; ans = temp;
rep1(i,1,n){
if (a[i].tag == 1){
temp = temp - a[i].val*s0 + a[i].val*(s1-a[i].val);
s1 -= a[i].val;
s0 += a[i].val;
}else{
temp = temp - a[i].val*s1 + a[i].val*(s0-a[i].val);
s1 += a[i].val;
s0 -= a[i].val;
}
ans = max(ans,temp);
}
ol(ans);puts("");
}
return 0;
}

【2017 Multi-University Training Contest - Team 7】Hard challenge的更多相关文章

  1. 【2017 Multi-University Training Contest - Team 2】TrickGCD

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...

  2. 【2017 Multi-University Training Contest - Team 2】Maximum Sequence

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...

  3. 【2017 Multi-University Training Contest - Team 2】 Regular polygon

    [Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...

  4. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

  5. 【2017 Multi-University Training Contest - Team 5】Rikka with Competition

    [Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...

  6. 【2017 Multi-University Training Contest - Team 5】Rikka with Subset

    [Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...

  7. 【2017 Multi-University Training Contest - Team 5】Rikka with Graph

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...

  8. 【2017 Multi-University Training Contest - Team 4】Time To Get Up

    [Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...

  9. 【2017 Multi-University Training Contest - Team 4】Counting Divisors

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6069 [Description] 定义d(i)为数字i的因子个数; 求∑rld(ik) 其中l,r ...

随机推荐

  1. 关于nios 中printf 的问题

    在nios中,有printf的程序,在线调试没有什么问题,但是下到flash里面,程序跑了一段时间就死掉了!JTAG_UART是阻塞式输出,他只是将数据输出到buffer中,等待你上位机读取,当你的b ...

  2. 存储过程和transaction

    https://stackoverflow.com/questions/11531352/how-to-rollback-a-transaction-in-a-stored-procedure BEG ...

  3. 技术报告:APT组织Wekby利用DNS请求作为C&C设施,攻击美国秘密机构

    技术报告:APT组织Wekby利用DNS请求作为C&C设施,攻击美国秘密机构 最近几周Paloalto Networks的研究人员注意到,APT组织Wekby对美国的部分秘密机构展开了一次攻击 ...

  4. vue --- cli build 后的项目,图片路径出错

    今天在插入背景图片过程中,遇到了路径错误的问题,通过网上查询,找到了解决的办法,但是大部分都没有讲造成这种问题的原因,故我简单地总结了一下,并加入了一些自己的理解,欢迎共同探讨~ 当用vue-cli自 ...

  5. POJ 3629 队列模拟

    听说STL会卡T 然后我就试了一发 哈哈哈哈哈哈哈哈哈哈 1000ms卡时过的 这很值得我写一发题解了 哈哈哈哈哈哈哈哈哈哈哈哈 //By SiriusRen #include <queue&g ...

  6. 破解root用户密码 -rwx权限

    破解root用户密码(本地登录) 1.光驱要放入系统光盘 2.重启os 3.修改启动菜单进入1运行级别 4.设置新密码 5.重启os linux的运行级别(默认3或5): 查看默认的运行级别 cat ...

  7. Xcode Git 客户端 + GitBucket 服务器 使用整合归纳

    1.使用前说明: 不知道XCode,Git的请自行度娘,不知道GitBucket的,可参考文章:git 私服搭建-gitbucket 初试牛刀 2.创建Git步骤 1>在gitbucket创建账 ...

  8. MyReport.Form表单引擎

    MyReport.Form表单引擎.主要提供表单模板的设计以及表单模板的预览填报等功能集合. 支持文本框.选择框.数字框.日期框.图片框.组合框.弹出框等经常使用控件. watermark/2/tex ...

  9. Es61

    ECMAScript和JavaScript的关系 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.Mozilla公司将在这个标准的基础 ...

  10. RadioButton的check改变的时候

    https://stackoverflow.com/questions/8095256/asp-net-radio-button-change You'll need to specify the a ...