• 【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
  • 相关阅读:
    Metasploit的使用命令_1
    Kali Linux -系统定制
    20200522随笔
    阿里大于接口的问题
    根据一篇文章学习逻辑漏洞
    flask注册蓝图报错
    python 生成验证码
    flask-mail 机制
    对巡风vulscan的理解
    “百度杯” YeSerCMS
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7954139.html
Copyright © 2020-2023  润新知