2017 Multi-University Training Contest

来源:互联网 发布:淘宝卖高仿名牌包 编辑:程序博客网 时间:2024/06/14 11:28

比赛的时候没有主攻这道题,其实这个题目的关键是那个 l * r 大家都没想出来,遗憾。

角度排序,枚举角度即可。这里利用对称性进行了代码优化。

        #include<iostream>        #include<cstdio>        #include<algorithm>        #include<vector>        #include<cmath>        #include<cstdlib>         using namespace std;                typedef struct node        {        double ang;        int x,y,val;        bool operator <(const node t) const        {        return ang<t.ang;}}node;vector<node> se;                int main(){    freopen("fuck.txt","r",stdin);    int T,n;    scanf("%d",&T);    for(int Case=1;Case<=T;Case++)    {    se.clear();    scanf("%d",&n);    long long l=0,r=0,ans=0;    for(int i=1;i<=n;i++)    {    int a,b,c;    node te;    scanf("%d%d%d",&a,&b,&c);    te.x=a;    te.y=b;    te.ang=atan(double(b)/a);    te.val=c;    se.push_back(te);}sort(se.begin(),se.end());for(int i=0;i<se.size();i++){if(se[i].x>=0) r+=se[i].val;else l+=se[i].val; }ans=l*r;for(int i=0;i<se.size();i++){if(se[i].x>=0) {r-=se[i].val;l+=se[i].val;}else{l-=se[i].val;r+=se[i].val;}ans=max(ans,l*r);}printf("%lld\n",ans);}return 0;}