Guard Duty (hard) Codeforces - 958E3 || uva 1411
https://codeforces.com/contest/958/problem/E3
当没有三点共线时,任意一个这样的点集都是保证可以找到答案的,(考虑任意一种有相交的连线方案,一定可以将其中两条相交的连线改成不相交的,并使得连线的总长度变小;显然连线的总长度最小的方案一定存在,则这种方案一定没有连线相交)
因此可以有一个分治做法:先在当前点集中找出最左、最下的点,找出一个点与其配对,使得以这两点间连线所在的直线划分开点集后,两边各自都满足白点数等于黑点数;显然一定能找到这个与其配对的点
找的方法就是其他点以选出这个点为中心做极角排序,然后双指针
复杂度n^2*log
本来以为分治时可以随便找出一个点,但事实上这样不对的,举个例子:

(以A2为选出点,则找不到配对点)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
namespace X
{
struct Point
{
int x,y;
Point(int x=,int y=):x(x),y(y){}
};
typedef Point Vec;
Vec operator+(const Vec& a,const Vec& b)
{
return Vec(a.x+b.x,a.y+b.y);
}
Vec operator-(const Vec& a,const Vec& b)
{
return Vec(a.x-b.x,a.y-b.y);
}
int dcmp(int x)
//正为1,负为-1,0为0
{
if(x==) return ;
return x<?-:;
}
bool operator==(const Vec& a,const Vec& b)
//判向量相等
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double cross(const Vec& a,const Vec& b)
//叉积
{
return a.x*b.y-a.y*b.x;
}
};
using namespace X;
Point p[];
int an[];
int d[],tmp[];
int n;
double ang[];
bool vis[];
bool c1(int a,int b)
{
return ang[a]<ang[b];
}
bool c2(int a,int b)
{
return p[a].x<p[b].x||(p[a].x==p[b].x&&p[a].y<p[b].y);
}
void solve(int l,int r)
{
if(r<l) return;
swap(*min_element(d+l,d+r+,c2),d[l]);
int i;
for(i=l+;i<=r;i++)
ang[d[i]]=atan2(p[d[i]].y-p[d[l]].y,p[d[i]].x-p[d[l]].x);
sort(d+l+,d+r+,c1);
int len=r-l,a[]={,},nl,nr;
for(nl=l+,nr=l;nl<=r;nl++)//包含(nl,nr]的点,nl自身与l相连
{
while(nr<nl||(nr-nl+<len&&cross(p[d[(nr-l)%len+l+]]-p[d[l]],p[d[nl]]-p[d[l]])<))
{
++nr;
a[d[(nr-l-)%len+l+]<=n]++;
}
a[d[nl]<=n]--;
if(int(d[nl]<=n)+(d[l]<=n)==&&a[]==a[]) break;
}
if(d[l]<=n) an[d[l]]=d[nl];
else an[d[nl]]=d[l];
for(i=l+;i<=r;i++)
vis[i]=;
vis[nl]=;
tmp[]=;
for(i=nl+;i<=nr;i++)
{
vis[(i-l-)%len+l+]=;
tmp[++tmp[]]=d[(i-l-)%len+l+];
}
int t1=l;
for(i=l+;i<=r;i++)
if(!vis[i])
{
d[++t1]=d[i];
}
int t2=t1;
for(i=;i<=tmp[];i++)
d[++t2]=tmp[i];
solve(l+,t1);solve(t1+,t2);
}
int main()
{
int i;
while(scanf("%d",&n)==)
{
for(i=;i<=*n;i++) scanf("%d%d",&p[i].x,&p[i].y);
for(i=;i<=*n;i++) d[i]=i;
solve(,*n);
for(i=;i<=n;i++) printf("%d\n",an[i]-n);
}
return ;
}
双倍经验:https://vjudge.net/problem/UVA-1411
Guard Duty (hard) Codeforces - 958E3 || uva 1411的更多相关文章
- Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化
https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...
- 【UVA 1411】 Ants (KM)
Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...
- UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- uva 1411 Ants
题意: 一个平面上有n个黑色的点,n个白色的点,要求黑色的点与白色点之间一一配对,且线段之间不相交. 思路: 线段不相交并不好处理,想了很久想不出,所以看了蓝书的讲解. 一个很明显的结论是,不相交的线 ...
- 【uva 1411 Ants蚂蚁们】
题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...
- CF 958E2. Guard Duty (medium)
这道题是昨天linkfqy dalao上课讲的一道题 当时他讲的时候就想到了一种玄学的搞法,然后不敢相信自己切掉了 没想到后来CHJ dalao也想到了这种算法,然后发现是对的 后来10min就切掉了 ...
- UVa 1411 Ants(分治)
https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...
随机推荐
- shell动态变量
面对变量中嵌套变量,可以这么做 other_devops_ip="......." options='_ip' tennat_name='other_devops' tennat_ ...
- HTML预览 正则替换
1. [代码][PHP]代码 <?php if(!defined('BASEPATH')) exit('No direct script access allowed'); /** ...
- (QACNN)自然语言处理:智能问答 IBM 保险QA QACNN 实现笔记
follow: https://github.com/white127/insuranceQA-cnn-lstm http://www.52nlp.cn/qa%E9%97%AE%E7%AD%94%E7 ...
- mpvue微信小程序分包
## 微信小程序分包(mpvue) 使用mpvue分包示例:1.下载vue脚手架(先有node环境,v8.12.0) npm install -g vue-cli 2.先用vue初始化一个mpvue小 ...
- 「BZOJ3083」遥远的国度(树剖换根
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 4859 Solved: 1372[Submit][Status][Discu ...
- ComboBox的真实值和显示值
一.类型 /// <summary> /// 下拉框值类型 /// </summary> public class TextAndValue { /// <summary ...
- SecureCRT rz上传文件失败
SecureCRT 将 Windows 上的文件传至 Linux 端,小的文件没有问题能够正常上传,但是对于几百M的文件往往上传过程中失败. 解决办法:使用 rz -be,并且去掉对话框中" ...
- 【转】C/C++使用心得:enum与int的相互转换
https://blog.csdn.net/lihao21/article/details/6825722 如何正确理解enum类型? 例如: enum Color { red, white, blu ...
- 关于使用quartz动态增删改定时任务
1. 首先, 还是喜闻乐见的导包 <dependency> <groupId>org.springframework.boot</groupId> <arti ...
- opencv 笔记
http://docs.opencv.org/ opencv 2.x API opencv包含以下模块 core 基本数据机构 imgproc 图像处理方法 video 视频处理方法 ...