UVaLive4043 UVa1411 Ants 巨人与鬼
题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点。
法一:暴力
随机一个初始方案,枚举任意两条线段如果有交点就改一下。
效率其实挺好的。
法二:二分图最佳完美匹配
显然没有交点的方案是所有线段的长度和最小的方案,将边权构造为欧几里德距离即可,$O(n^4)$的算法效率远不及法一,$O(n^3)$与法一持平。
法三:分治
这是紫书上介绍的方法,每次找出一个最下最左的点,将其他的点相对于这个点进行极角排序,按极角序扫描,当白点和黑点一样多时(算上最下最左那个点),将第一个点和最后一个点配对,递归处理剩下的两部分。时间复杂度大概是$O(n^2\log{n})$的?效率最高。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream> using namespace std;
const int N = + ; #include<cmath>
struct Point {
int x, y;
Point() {}
Point(int x, int y) : x(x), y(y) {}
double angle(const Point& p) const {
return atan2(y - p.y, x - p.x);
}
bool operator < (const Point &rhs) const {
return y < rhs.y || (y == rhs.y && x < rhs.x);
}
void read() {
scanf("%d%d", &x, &y);
}
}; int n;
struct Node {
Point p;
int id;
double ang; bool operator < (const Node &rhs) const {
return ang < rhs.ang;
} void getangle(const Point& p0) {
ang = p.angle(p0);
} int type() const {
return id <= n ? : -;
}
}p[N * ]; int ans[N * ]; void solve(int l, int r) {
if(l > r) return;
int pos = l;
for(int i = l + ; i <= r; i++) {
if(p[i].p < p[pos].p) pos = i;
}
swap(p[pos], p[l]);
int cnt = p[l].type();
for(int i = l + ; i <= r; i++) {
p[i].getangle(p[l].p);
}
sort(p + l + , p + r + );
for(int i = l + ; i <= r; i++) {
cnt += p[i].type();
if(!cnt) {
ans[p[l].id] = p[i].id;
ans[p[i].id] = p[l].id;
solve(l + , i - );
solve(i + , r);
return;
}
}
} int main() {
while(scanf("%d", &n) == ) {
for(int i = ; i <= (n << ); i++) {
p[i].p.read();
p[i].id = i;
} solve(, n << );
for(int i = ; i <= n; i++) {
printf("%d\n", ans[i] - n);
}
} return ;
}
分治算法
UVaLive4043 UVa1411 Ants 巨人与鬼的更多相关文章
- 1411 - Ants(巨人与鬼)
参考博客 紫薯P230 题意:给出平面上n个白点n个黑点,要求两两配对,且配对所连线段没有交点. 紫薯思路:找出y坐标最小的点,如果多个,考虑x最小的.将其他点相对于这个点按极角从小到大排序,然后开始 ...
- 【题解】Luogu UVA1411 Ants
原题传送门 博客里对二分图匹配的详细介绍 这道题是带权二分图匹配 用的是KM算法 我们要知道一个定理:要使线段没有相交,要使距离总和最小 我们先把任意一对白点.黑点的距离算一下 然后运用KM算法 因为 ...
- UVA1411 Ants
想出的一道题竟然是原题QAQ 非常有趣的一个题 根据三角形两边之和大于第三边 所以相交的线段一定是比不相交的线段要长的 所以直接二分图构图 最小费用最大流即可 (我不管我不管我要把这个出到NOIP膜你 ...
- UVa 1411 Ants(分治)
https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...
- 使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
一.前言 最近一段时间,网站经常出现两个问题: 1.内存占用率一点点增高,直到将服务器内存占满. 2.访问某个页面时,页面响应过慢,CPU居高不下. 初步判断内存一点点增多可能是因为有未释放的资源一直 ...
- APIJSON,让接口见鬼去吧!
我: APIJSON,让接口见鬼去吧! https://github.com/TommyLemon/APIJSON 服务端: 什么鬼? 客户端: APIJSON是啥? 我: APIJSON是一种JSO ...
- poj1852 Ants ——想法题、水题
求最短时间和最长时间. 当两个蚂蚁相遇的时候,可以看做两个蚂蚁穿过,对结果没有影响.O(N)的复杂度 c++版: #include <cstdio> #define min(a, b) ( ...
- 【初窥javascript奥秘之事件机制】论“点透”与“鬼点击”
前言 最近好好的研究了一番移动设备的点击响应速度,期间不断的被自己坑,最后搞得焦头烂额,就是现在可能还有一些问题,但是过程中感觉自己成长不少, 最后居然感觉对javascript事件机制有了更好的认识 ...
- Uva10881 Piotr's Ants
蚂蚁相撞会各自回头.←可以等效成对穿而过,这样移动距离就很好算了. 末状态蚂蚁的顺序和初状态其实是相同的. 那么剩下的就是记录每只蚂蚁的标号,模拟即可. /*by SilverN*/ #include ...
随机推荐
- SVM(支持向量机)算法
第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...
- Kafka源码分析-序列2 -Producer
在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述.从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列.我们的分析将从Producer端开始. 从Kafka ...
- angular 控制器之间值得传递
<div ng-controller="ParentCtrl"> <!--父级--> <div ng-controller="SelfCtr ...
- 十进制和n进制的转换(10进制转换为36进制)
答案如下: void Convert() { map<int ,string> maps; maps[0]="0"; maps[1]="1"; ma ...
- PDF抽取文字 C# with Adobe API
前提是PDF里面是有文字的! 一次性取得所有页内容: /// <summary> /// 改进前取得所有页的所有word /// </summary> /// <para ...
- windows server 2003 服务器
服务器基本知识:可通过我的电脑属性里面查看服务器的系统. 设置固定Ip:本地连接(控制面板-网络连接)使用下面的Ip地址.通过ipconfig/all,查看DNS和ip. 远程访问服务器:我的电脑属性 ...
- 高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)
一,BigPipe简介 BigPipe是一个重新设计的基础动态网页服务体系.大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行.这是类似于 ...
- bzoj 1079: [SCOI2008]着色方案 DP
1079: [SCOI2008]着色方案 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 803 Solved: 512[Submit][Status ...
- Condition 的使用
Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set ...
- KeilC51常用功能模块使用说明
本文档包括单片机系统中常用到的时钟中断.通讯及键盘扫描等模块(见所附源程序)的说明.这些模块使用前后台系统模型.为达到最大的灵活性, 需要在用户工程中定义config.h文件, 在其中定义各模块可选参 ...