【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 ...
随机推荐
- 前端HTML基础
1.0开发工具介绍 sublime的使用技巧链接 HTML特殊符号表 1.1 html概念 超文本标记语言(Hypertext Markup Language),属于一种描述性的标记语言(markup ...
- es6-promise.auto.js
使用sweetalert2的IE浏览器报错,导入文件 链接:https://pan.baidu.com/s/1mOcsN_o8m-7I7Rej1NPkiw 提取码:9xsj
- 网际协议 IP
网际协议 网际协议(internet protocol),简称IP; 概念:TCP/IP网络体系结构中网际层的协议.用以提供无连接的数据服务. 1.IP地址的概念及组成 概念:IP地址就是用来唯一标 ...
- 用ajax获取淘宝关键字接口
可定需要查看淘宝界面的结构,按F12查看网页,此时先清除一下网页中的数据,让Network制空,随后在输入框中输入新的内容,比如钱包,数据中会出现新的数据.点击及查看蓝色方框中的内容 点击之后,你可以 ...
- 使用PHP生成分享图片
小程序导航 wq.xmaht.top 假设代码中用到的资源文件夹在当前code_png目录下: /** * 分享图片生成 * @param $gData 商品数据,array * @param $co ...
- HAN模型理解2
Hierarchical Attention Networks for Document Classification 论文的理解 在论文的摘要中,它提出了论文的两个特点.第一个就是对应文章所有具有的 ...
- Linux基础知识与命令1(su passwd)
一.Linux的基本原则 1.linux由一个个目的单一的小程序组成,我们一般需要组合小程序来完成复杂的任务 2.Linux的一切都是文件(文件类似于一棵树,包括外设,接口) 3.Linux尽量避免捕 ...
- GDOI--DAY2 游记
今天,熬夜不够多,果然,不出所料,爆零了... 第一题,看到数据之大,懵逼了,于是,敲了个二分SPFA,但是!最大的点GG了,呜呜~~~~(>_<)~~~~ ,于是,就不继续做第一题了(虽 ...
- C++基础 new和delete
1.new delete 的使用 (1)基本数据类型 ); delete p; int *p = (int *)malloc(sizeof(int)); *p = ;free(p); (2)数组 ]; ...
- spark streaming的应用
今天我们讲spark streaming的应用,这个是实时处理的,类似于Storm以及Flink相关的知识点, 说来也巧,今天的自己也去听了关于Flink的相关的讲座,可惜自己没有听得特别清楚,好像是 ...