【bzoj2044】三维导弹拦截 dp+二分图最大匹配
题目描述
n个物品,第i个位置有ai、bi、ci三种属性。每次可以选出满足$\ a_{p_i}<a_{p_{i+1}}\ ,\ b_{p_i}<b_{p_{i+1}}\ ,\ c_{p_i}<c_{p_{i+1}}\ $的一段序列$p_1,p_2,...,p_k$(不要求$p_1,p_2,...,p_k$的大小关系),将这些物品$p_i$消掉。问:(1)一次最多能够消掉的物品的数目。 (2)最少需要多少次操作能够把所有物品全部消掉。
输入
第一行一个整数N给出B国导弹的数目。 接下来N行每行三个非负整数Xi, Yi, Zi给出一个导弹的位置,你可以假定任意两个导弹不会出现在同一位置。
输出
第一行输出一个整数P,表示一枚拦截导弹之多能够摧毁的导弹数。 第二行输出一个整数Q,表示至少需要的拦截导弹数目。
样例输入
4
0 0 0
1 1 0
1 1 1
2 2 2
样例输出
3
2
题解
dp+二分图最大匹配
第一问按照第一维排序,然后$n^2$暴力求二维LIS即可。
第二问如果把能够先打A后打B的A向B连边,那么显然这是一个DAG图,我们要求的是它的最小路径覆盖。
这是经典的二分图建模了,说一下做法吧:
每个原图中的点拆成两个($A_i$和$A_j$),如果存在边$A\to B$,则连边$A_i\to B_j$。跑二分图最大匹配,n-最大匹配即为答案。
于是直接上匈牙利算法/dinic即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
using namespace std;
struct data
{
int a , b , c;
bool operator<(const data x)const {return a < x.a;}
}v[N];
int f[N] , head[N] , to[N * N] , next[N * N] , cnt , vis[N] , from[N];
inline void add(int x , int y)
{
to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
bool dfs(int x)
{
int i;
for(i = head[x] ; i ; i = next[i])
{
if(!vis[to[i]])
{
vis[to[i]] = 1;
if(!from[to[i]] || dfs(from[to[i]]))
{
from[to[i]] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int n , i , j , ans1 = 0 , ans2 = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%d" , &v[i].a , &v[i].b , &v[i].c);
sort(v + 1 , v + n + 1);
for(i = 1 ; i <= n ; i ++ )
{
f[i] = 1;
for(j = 1 ; j < i ; j ++ )
if(v[j].a < v[i].a && v[j].b < v[i].b && v[j].c < v[i].c)
f[i] = max(f[i] , f[j] + 1) , add(j , i);
ans1 = max(ans1 , f[i]);
}
printf("%d\n" , ans1);
for(i = 1 ; i <= n ; i ++ )
{
memset(vis , 0 , sizeof(vis));
if(dfs(i)) ans2 ++ ;
}
printf("%d\n" , n - ans2);
return 0;
}
【bzoj2044】三维导弹拦截 dp+二分图最大匹配的更多相关文章
- 【BZOJ2044】三维导弹拦截 DP+(有上下界的)网络流
[BZOJ2044]三维导弹拦截 Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指 ...
- [bzoj2044] 三维导弹拦截 (二分图最大匹配+dp)
传送门 Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利! ...
- bzoj2044: 三维导弹拦截
Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...
- 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)
传送门:Problem 1020 https://www.cnblogs.com/violet-acmer/p/9852294.html 讲解此题前,先谈谈何为最长上升子序列,以及求法: 一.相关概念 ...
- P1020 导弹拦截 dp 树状数组维护最长升序列
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- UESTC 2015dp专题 N 导弹拦截 dp
导弹拦截 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descrip ...
- bzoj 2044 三维导弹拦截——DAG最小路径覆盖(二分图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2044 还以为是CDQ.发现自己不会三维以上的…… 第一问可以n^2.然后是求最长不下降子序列 ...
- 导弹拦截 dp
n∗lognn*lognn∗logn写法,lis[i]的意义为:所有最长上升子序列长度为i的位置上的最小a数组元素值lis[i]的意义为:所有最长上升子序列长度为i的位置上的最小a数组元素值lis[i ...
- [BZOJ] 2044: 三维导弹拦截
排序去掉一维,剩下两维可以直接\(O(n^2)\)做,也可以用二维树状数组(但是不方便建边),解决第一问 第二问,按转移顺序连边,建出DAG,求最小不可重链覆盖即可 #include<algor ...
随机推荐
- 前端JavaScript之ECMA
1.JavaScript基础 2.语法规则 3 常用内置对象 4 函数 5 伪数组 6.异常处理 1.1 web前端分为三层 HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化 ...
- JavaScript中的事件循环
JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗 ...
- Web as a App(Web既APP)的概念可以提出吗?
Web as a App (WaaA),Web既APP.灵感出于SaaS.PaaS.IaaS等~ 最近在做一个PC项目,即便我的项目是to B的,用户量没那么大,但是我仍然很注重性能及用户体验,我把我 ...
- linux环境下nginx配置
1.反向代理配置 # nginx/conf/nginx.conf
- 【Ecshop】商品数据采集扩展
一个自用的Ecshop商品数据采集程序 ->到此下载
- 【转载】CString,string,char*之间的转换
本文转自 <> 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌 ...
- 【Python 2 到 3 系列】 print 是函数
v3.0 以前,print一直作为语法结构存在,他是python语法的一部分:这个理解起来可能有点蹩脚,但的确是这样. print 一直被定以为一个statement,也就是说,他跟return/tr ...
- 从coding.net 克隆(git clone)项目代码到本地报无权限(403)错误 解决方案
直接从coding.net (git clone)项目代码到本地时,会提示没有权限的错误,如下图: 解决方案:添加远程地址的时候带上用户名及密码即可解决,格式如下: git clone http:// ...
- 图解HTTP总结(6)——HTTP首部
HTTP报文首部 HTTP 协议的请求和响应报文中必定包含 HTTP 首部. 首部内容为客户端和服务器分别处理请求和响应提供所需要的信息. 对于客户端用户来说, 这些信息中的大部分内容都无须亲自查看. ...
- 008---Django的模版层
python的模板:HTML代码+模板语法 <!--模版语法之变量--> <h1>Index </h1> <p>{{ name }}</p> ...