BZOJ2739 最远点(分治 + 决策单调性)
2739: 最远点 Time Limit: 20 Sec Memory Limit: 256 MB Description
给你一个N个点的凸多边形,求离每一个点最远的点。 Input
本题有多组数据,第一行一个数T,表示数据组数。
每组数据第一行一个数N,表示凸多边形点的个数,接下来N对数,依次表示1~N这N个点的坐标,按照逆时针给出。 Output
对于每组数据输出N个数,第i个数表示离第i个点最远的点的编号,如果有多个最远点,输出编号最小的。 Sample Input
1
4
0 0
1 0
1 1
0 1 Sample Output
3
4
1
2 HINT
数据规模和约定
坐标的绝对值在1e9以内;
任意点对距离数值的平方不会超过long long;
令S为每组数据凸多边形点数之和;
对于20%的数据,S<=2000;
对于50%的数据,S<=50000;
对于100%的数据,S<=500000;
数据有梯度。
算法讨论:
直接决策单调性,至于怎么证,因为这是个凸包。然后为什么决策点在[i, i + n]范围内是正贡献,在这个之处要取反比较,
看了下面这个图你就明白了,为了保证决策单调。

代码:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define stop system("pause")
using namespace std;
typedef long long ll;
const int N = 500000 + 5; int n;
int f[N];
struct Point {
int x, y, id;
}a[N << 1]; ll sqr(int x) { return 1LL * x * x; }
bool check(int i, int j, int k) {
ll x = 1LL * sqr(a[i].x - a[j].x) + 1LL * sqr(a[i].y - a[j].y);
ll y = 1LL * sqr(a[i].x - a[k].x) + 1LL * sqr(a[i].y - a[k].y);
if(j < i || j > i + n) x = -x;
if(k < i || k > i + n) y = -y;
return x == y ? (a[j].id > a[k].id) : (x < y);
} void solve(int l, int r, int dl, int dr) {
if(l > r) return;
int mid = l + (r - l) / 2;
int dmid = dl;
for(int i = dl; i <= dr; ++ i)
if(check(mid, dmid, i)) dmid = i;
f[mid] = a[dmid].id;
solve(l, mid - 1, dl, dmid);
solve(mid + 1, r, dmid, dr);
} #define stone_ int main() {
#ifndef stone_
freopen("nt2012_dis.in", "r", stdin);
freopen("nt2012_dis.out", "w", stdout);
#endif int T;
scanf("%d", &T);
while(T --) {
scanf("%d", &n);
for(int i = 1; i <= n; ++ i) {
scanf("%d%d", &a[i].x, &a[i].y);
a[i].id = i; a[i + n] = a[i];
}
solve(1, n, 1, n << 1);
for(int i = 1; i <= n; ++ i)
printf("%d\n", f[i]);
//puts("");
} #ifndef stone_
fclose(stdin); fclose(stdout);
#endif
return 0;
}
BZOJ2739 最远点(分治 + 决策单调性)的更多相关文章
- 2019.02.21 bzoj2739: 最远点(决策单调性+分治)
传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...
- [BZOJ2739]最远点(DP+分治+决策单调性)
根据旋转卡壳,当逆时针遍历点时,相应的最远点也逆时针转动,满足决策单调性.于是倍长成链,分治优化DP即可,复杂度O(n^2). #include<cstdio> #include<a ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- bzoj2216: [Poi2011]Lightning Conductor(分治决策单调性优化)
每个pi要求 这个只需要正反DP(?)一次就行了,可以发现这个是有决策单调性的,用分治优化 #include<iostream> #include<cstring> #incl ...
- 决策单调性&wqs二分
其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...
- bzoj 2739 最远点——分治处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2739 分治处理决策单调性的思想就是先找到一个询问,枚举所有可能的转移找到它的决策点,那么这个 ...
- CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)
题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...
- P2877 [USACO07JAN]牛校Cow School(01分数规划+决策单调性分治)
P2877 [USACO07JAN]牛校Cow School 01分数规划是啥(转) 决策单调性分治,可以解决(不限于)一些你知道要用斜率优化却不会写的问题 怎么证明?可以暴力打表 我们用$ask(l ...
- 洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)
洛谷题目传送门 貌似做所有的DP题都要先搞出暴力式子,再往正解上靠... 设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用. ...
随机推荐
- poj2486
题目大意:给出一个树,每个节点有一个值,问从1开始走走k步最多能遍历到最大的值的和:dp[i][j][k] 当i为零是表示如果从j点开始遍历以j为跟的子树,走k步后回到原点的最大值.dp[i][j][ ...
- Linux下makefile(一)
makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文 ...
- notepad++搜索结果不显示line XX的方法
在使用notepad++如果多次搜索,得到的结果中会出现多次line xx: line xx:,造成文件大量垃圾信息的存在,不利于找寻所需的内容,如下图. 对于这种情况, ...
- java并发编程_建立概念
在学习多线程编程时,相信大家会遇到好多概念类的东西,对于这些概念的不准确理解会导致后面越学越糊涂,现将学习过程中遇到的概念整理到这篇博客上,一来记录学习点滴,二来也加深理解,如果有理解不准确的地方,希 ...
- JAVA_build_ant_sed
1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- 神经网络及其简单实现(MATLAB)
转自:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html 第0节.引例 本文以Fisher的Iris数据集作为神经网络程序的测试 ...
- cf B. Two Heaps
http://codeforces.com/contest/353/problem/B 题意:要把2*n个两位数分成两部分,使得第一部分上的数和第二部分上的两位数组成四位数.求怎么分能使构成的不同的四 ...
- void (*fun)(void);
2440test程序中的Main.c中在结构体中有这么一句: void (*fun)(void); 后查阅资料得知这句代码的意思是: 定义一个函数指针. 比如:定义一个指向函数的指针,该函数有一个整形 ...
- android 无法生成R文件的原因剖析
android 无法生成R文件 是件痛苦的事情,即使有时候你xml文件没有错误,他都无法生成.针对此问题,我总结以下几个方面的原因. 一.xml本身有错误 R.java这个文件是会自动生成的,但是如果 ...
- sql模糊匹配
执行 数据库查询时,有完整查询和模糊查询之分. 一般模糊语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,%:表示任意0个 ...