luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
LINK:智破连环阵
考试的时候 题意没理解清楚 题目是指一个炸弹爆炸时间结束后再放另一个炸弹 而放完一个炸弹紧接另一个炸弹。题目中存在然后二字.
这样我们可以发现某个炸弹只会炸连续的一段。
但是 由于点的坐标虽然只在第一象限 炸弹也在第一象限 不过简单的设出几个状态可以发现 是不可行的。
状压也不行。考虑贪心但是还是要要考虑坐标以及序号的问题 所以很难贪出正确答案。
无奈之下只能选择搜索了 一种比较简单的搜索方式还是搜出把序列分段。
可以发现这样复杂度最坏是2^n的。
求出分段之后我们还需要考虑匹配问题。
容易发现是一个二分图的问题直接跑匈牙利即可。
考虑加剪枝以优化。
一个比较容易想到的剪枝:最优化剪枝 对于当前点x 我们可以预估一个最优答案d[x]表示x~n都可以被满足且此时炸弹随便选的最小炸弹数 这样这个最优化剪枝的效果更好且保证答案正确。
一个可行性剪枝:搜出当前分段后 先判断一下最大匹配是否成功再继续搜下去。
一个接替前驱答案的优化:不需要每次最大匹配重新跑 可以直接直接拿上一层的结果跑。
注意枚举区间由大到小做 这样也可以加快。
一些其他剪枝我没加:如精确判断区间的右断点的最大延伸。这个还需要判断一下交错路什么的我觉得比较复杂 复杂度也比较高 所以就没加。在数据随机的情况下上述剪枝已经很快了。
const int MAXN=110;
int ans,n,m,k,id;//炸弹m个 n个点 a[i][j]表示第i个炸弹是否可以炸到点j.
int a[MAXN][MAXN],c[MAXN][MAXN],d[MAXN];//c[i][j]表示第i个炸弹从j点开始炸的最远点.
struct wy{int x,y;}A[MAXN],B[MAXN];//d[i]表示i~n个点被炸在每个点被用多次时的最小值.
inline int pd(int x,int y){return pf(B[x].x-A[y].x)+pf(B[x].y-A[y].y)<=pf(k);}
int f[MAXN],w[MAXN][MAXN],vis[MAXN];
inline void prepare()
{
rep(1,m,i)fep(n,1,j)if(a[i][j])c[i][j]=max(j,c[i][j+1]);
fep(n,1,i){d[i]=INF;rep(1,m,j)if(a[j][i])d[i]=min(d[i],d[c[j][i]+1]+1);}
}
inline int dfs(int x)
{
rep(1,m,i)
{
if(vis[i]!=id&&w[i][x])
{
vis[i]=id;
if(!f[i]||dfs(f[i]))
{
f[i]=x;
return 1;
}
}
}
return 0;
}
inline void dfs(int x,int v)
{
if(v+d[x]>=ans)return;
if(x==n+1){ans=v;return;}
int g[MAXN];
rep(1,m,i)g[i]=f[i];
fep(n,x,i)
{
rep(1,m,j)if(c[j][x]>=i)w[j][v+1]=1;
++id;if(dfs(v+1))dfs(i+1,v+1);
rep(1,m,j)if(c[j][x]>=i)w[j][v+1]=0;
rep(1,m,j)f[j]=g[j];
}
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);get(k);
rep(1,n,i){int get(x);A[i]=(wy){x,read()};}
rep(1,m,i){int get(x);B[i]=(wy){x,read()};}
rep(1,m,i)rep(1,n,j)a[i][j]=pd(i,j);
prepare();ans=INF;dfs(1,0);put(ans);
return 0;
}
luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝的更多相关文章
- P1526 [NOI2003]智破连环阵
目录 题意描述 算法分析 闲话 初步分析 具体思路 剪枝一 剪枝二 剪枝三 总结一下 代码实现 预处理 剪枝一 剪枝二 剪枝三 二分图匹配 代码综合 结语 又是被楼教主虐的体无完肤的一天 题意描述 在 ...
- 题解-NOI2003 智破连环阵
题面 NOI2003 智破连环阵 有 \(m\) 个靶子 \((ax_j,ay_j)\) 和 \(n\) 个箭塔 \((bx_i,by_i)\).每个箭塔可以射中距离在 \(k\) 以内的靶子.第 \ ...
- bzoj4622 [NOI 2003] 智破连环阵
Description B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经 ...
- 【21.00%】【vijos P1018】智破连环阵
描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...
- [luogu1526]智破连环阵
(以下在描述复杂度时,认为$n$和$m$相同,因此一律使用$n$) 称第$i$个炸弹能匹配非空区间$[l,r]$,当且仅当$l$到$r$内所有武器都在$i$攻击范围内,且$r=m$或第$r+1$个武器 ...
- bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】
一个炸弹炸一个区间的武器,想到二分图匹配 但是直接dfs断点显然不行,预处理出dis[i]为i到m的至多值来最优性剪枝,并且标记ok[i][j]为炸弹i可以炸到j武器,mx[i][j]为i炸弹从j武器 ...
- 搜索(剪枝优化):HDU 5113 Black And White
Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...
- Luogu 2756 飞行员配对方案问题(二分图最大匹配)
Luogu 2756 飞行员配对方案问题(二分图最大匹配) Description 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞 ...
- [CF293B]Distinct Paths_搜索_剪枝
Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...
随机推荐
- 区间dp(低价回文)
[题目大意] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身份信息.目前,每个身份都是由一个字符 ...
- arm64-v8a 静态成员模板 undefined reference to
谷歌发布新包需要64位的so Application.mk 中 APP_ABI := armeabi armeabi-v7a x86 x86_64 arm64-v8a 添加了 arm64-v8a 和 ...
- 删除排序数组中的重复项--leetcode算法题
题目来自于leetcode 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...
- 数据可视化之powerBI入门(四)Power BI与PowerQuery、PowerPivot有什么关系
https://zhuanlan.zhihu.com/p/64146209 Power BI与PowerQuery.PowerPivot有什么关系? 刚开始学习PowerBI的时候,总是能碰到Powe ...
- redis(十二):Redis 集合(Set)
Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...
- JSON基础使用详解
JSON:JavaScript对象表示法 1.1 JSON说明 曾经一段时间,XML是互联网传递数据的统一标准,但是业界一直不乏质疑XML的人士,他们都认为XML过于繁琐,冗长:提取数据也过于麻烦 2 ...
- typedef struct 指针结构体使用方法
A>>>>>>>>>>>>>>>>>>>>>>>> ty ...
- SpringBoot 整合Mybatis + PageHelper 实现分页
前言: 现在公司大多数都实现了前后端分离,前端使用Vue.React.AngularJS 等框架,不用完全依赖后端.但是如果对于比较小型的项目,没必要前后端分离,而SpringBoot也基本抛弃了Js ...
- 组件缓存注意事项 ---keep-alive
- vue学习(十九) 生命周期 了解
生命周期:从vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件统称为生命周期 生命周期钩子:就是生命周期事件的别名而已 生命周期钩子==生命周期函数==生命周期事件 生命周期函数分类 ...