BZOJ5099 POI2018Pionek】的更多相关文章

假设确定了最终所得向量的方向,则应该选择所有在该方向上投影为正的向量.按极角序排序后这显然是一段连续区间.最终向量方向很难枚举,但对于某个向量,在其上投影为正的向量与其夹角范围是(-π/2,π/2),所以只要枚举所有极角差不超过π的极长区间就可以了.这里的区间不是向量区间而是极角区间,相当于一条过原点的直线在旋转,所以双指针移动时每个向量区间都要更新答案.为了方便倍长向量数组,注意这样对于增加的那一半,极角需要加上2π. #include<iostream> #include<cstdi…
[BZOJ5099][POI2018]Pionek Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只能执行一次,但你可以随意更改它们的执行顺序.棋子可以重复经过同一个点,两条指令的方向向量也可能相同.你的目标是让棋子最终离原点的欧几里得距离最远,请问这个最远距离是多少? Input 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整数x,y(|x|,|y|<=1…
Description 给 \(n\) (\(n\le 2\times 10 ^5\)) 个向量,现在你在 \((0,0)\) ,选择一些向量使你走的最远. Solution 自己的想法:按极角排序后双指针 \(l, r\) 扫,若选择 \(r + 1\) 向量走的更远就 r++ ,否则 l++ ,用 \([l,r]\) 的向量和与答案 \(chkmax\). 这样是错的,虽然答案最后一定是一段连续的区间,但这个并不满足局部最优,所以可能 \(r\) 指针需要舍弃一些不优的右移而到一个更好的位置…
Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表 示.每条指令最多只能执行一次,但你可以随意更改它们的执行顺序.棋子可以重复经过同一个点,两条指令的方 向向量也可能相同.你的目标是让棋子最终离原点的欧几里得距离最远,请问这个最远距离是多少? Input 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整数x,y(|x|,|y|<=10000),表示你可以从(a,b)移动到(a+x…
题目描述 给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大.求这个最大长度的平方. 输入 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整数x,y(|x|,|y|<=10000),表示你可以从(a,b)移动到(a+x,b+y). 输出 输出一行一个整数,即最大距离的平方. 样例输入 5 2 -2 -2 -2 0 2 3 1 -3 1 样例输出 26 题解 双指针法 一个结论:向量和的长度等于所有向量在其方向上投影的长度和. 因此想要向量和…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5099 题解 这道题做法似乎挺单一的. (一开始想了个假做法 向量和的长度等于所有向量在其方向上投影的长度和. 为了最大化长度的话,要能够保证所有向量在长度和的方向上投影都是正的. 所以可以枚举与向量和垂直的向量作为一个端点,那么另一个端点的方向应该和它的差距不超过 \(180\). 所以可以双指针枚举一下左右端点,一边移动一边统计就没有问题了. 时间复杂度 \(O(n\log n)\) (就…
[BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量会被选入答案集合当且仅当向量在答案方向上的投影一定都是正的 所以,两个选中向量中间隔着一个向量,则必然可以将后面所有选中向量均前移一位并使答案不劣. 2.答案集合中不存在两个向量的极角差超过$\pi$. 显然需要保证的是,答案集合中任意两个向量投影不为负值,否则一定可以通过删去其中一个使答案更优.…