zoukankan      html  css  js  c++  java
  • 【BZOJ5099】[POI2018]Pionek 几何+双指针

    【BZOJ5099】[POI2018]Pionek

    Description

    在无限大的二维平面的原点(0,0)放置着一个棋子。你有n条可用的移动指令,每条指令可以用一个二维整数向量表示。每条指令最多只能执行一次,但你可以随意更改它们的执行顺序。棋子可以重复经过同一个点,两条指令的方向向量也可能相同。你的目标是让棋子最终离原点的欧几里得距离最远,请问这个最远距离是多少?

    Input

    第一行包含一个正整数n(n<=200000),表示指令条数。
    接下来n行,每行两个整数x,y(|x|,|y|<=10000),表示你可以从(a,b)移动到(a+x,b+y)。

    Output

    输出一行一个整数,即最大距离的平方。

    Sample Input

    5
    2 -2
    -2 -2
    0 2
    3 1
    -3 1

    Sample Output

    26

    HINT

    题解:假如我们已经确定了最终向量的方向,那么我们就会选择所有在这个方向上投影为正的向量。于是我们将所有向量按极角排序,然后枚举所有方向,用前缀和维护向量的和。可以先将序列倍长,然后用双指针法扫一遍即可。

    不过需要注意的是,我们枚举的方向不仅是所有向量的方向,还有所有向量之间间隔的方向,所以我们在每个指针移动的时候都更新一下答案即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #define pi acos(-1.0)
    using namespace std;
    typedef long long ll;
    const int maxn=200010;
    int n;
    ll ans;
    struct node
    {
    	int x,y;
    	double a;
    }p[maxn<<1];
    ll sx[maxn<<1],sy[maxn<<1];
    bool cmp(const node &a,const node &b)
    {
    	return a.a<b.a;
    }
    inline void check(int l,int r)
    {
    	if(l<=r)	ans=max(ans,(sx[r]-sx[l-1])*(sx[r]-sx[l-1])+(sy[r]-sy[l-1])*(sy[r]-sy[l-1]));
    }
    inline int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();
    	return ret*f;
    }
    int main()
    {
    	n=rd();
    	int i,j;
    	for(i=1;i<=n;i++)	p[i].x=rd(),p[i].y=rd(),p[i].a=atan2(p[i].x,p[i].y),p[i+n]=p[i],p[i+n].a+=2*pi;
    	sort(p+1,p+2*n+1,cmp);
    	for(i=1;i<=2*n;i++)	sx[i]=sx[i-1]+p[i].x,sy[i]=sy[i-1]+p[i].y;
    	for(i=j=1;i<=2*n;i++)
    	{
    		for(;j<i&&p[j].a<=p[i].a-pi;j++,check(j,i-1));
    		check(j,i);
    	}
    	for(;j<=2*n;check(j,2*n),j++);
    	printf("%lld",ans);
    	return 0;
    }//2 1 10 1 -10
  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7954139.html
Copyright © 2011-2022 走看看