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]智破连环阵 搜索+最大匹配+剪枝的更多相关文章

  1. P1526 [NOI2003]智破连环阵

    目录 题意描述 算法分析 闲话 初步分析 具体思路 剪枝一 剪枝二 剪枝三 总结一下 代码实现 预处理 剪枝一 剪枝二 剪枝三 二分图匹配 代码综合 结语 又是被楼教主虐的体无完肤的一天 题意描述 在 ...

  2. 题解-NOI2003 智破连环阵

    题面 NOI2003 智破连环阵 有 \(m\) 个靶子 \((ax_j,ay_j)\) 和 \(n\) 个箭塔 \((bx_i,by_i)\).每个箭塔可以射中距离在 \(k\) 以内的靶子.第 \ ...

  3. bzoj4622 [NOI 2003] 智破连环阵

    Description B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经 ...

  4. 【21.00%】【vijos P1018】智破连环阵

    描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...

  5. [luogu1526]智破连环阵

    (以下在描述复杂度时,认为$n$和$m$相同,因此一律使用$n$) 称第$i$个炸弹能匹配非空区间$[l,r]$,当且仅当$l$到$r$内所有武器都在$i$攻击范围内,且$r=m$或第$r+1$个武器 ...

  6. bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】

    一个炸弹炸一个区间的武器,想到二分图匹配 但是直接dfs断点显然不行,预处理出dis[i]为i到m的至多值来最优性剪枝,并且标记ok[i][j]为炸弹i可以炸到j武器,mx[i][j]为i炸弹从j武器 ...

  7. 搜索(剪枝优化):HDU 5113 Black And White

    Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...

  8. Luogu 2756 飞行员配对方案问题(二分图最大匹配)

    Luogu 2756 飞行员配对方案问题(二分图最大匹配) Description 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞 ...

  9. [CF293B]Distinct Paths_搜索_剪枝

    Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...

随机推荐

  1. LeetCode题解【题2】:两数相加

    原题链接:https://leetcode-cn.com/problems/add-two-numbers/ 查看请另起链接打开. 解题思路执行用时 :2 ms, 在所有 Java 提交中击败了99. ...

  2. chrome本地调试跨域问题

    1.关闭chrome浏览器(全部) 我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xia ...

  3. abp一代数据迁解析

    abp版本5.9 概述 数据迁移无非就是两件事情,1.创建数据库,并根据实体创建对应的表:2.添加一些初始数据 abp的数据迁移也是完成这两件事,比较特殊的是它是多租户saas系统,而且支持不同的租户 ...

  4. NumPy基础知识图谱

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载.该图谱只是NumPy的基 ...

  5. @Autowired 引发的一系列思考

    关于Java注解 注解定义 标记注解 - 没有元素 @interface Marker { } 单元素注解 - 只有一个元素 @interface Single { String value() de ...

  6. es6 模块与commonJS的区别

    在刚接触模块化开发的阶段,我总是容易将export.import.require等语法给弄混,今天索性记个笔记,将ES6 模块知识点理清楚 未接触ES6 模块时,模块开发方案常见的有CommonJS. ...

  7. python使用数组实现链表的策略分析

    python实现链表数据结构:数组/节点与引用 使用数组策略: 使用数组存储指向其他对象的引用 数组存储空间过度分配 数组填满后,分配一个更大的数组,将旧数组的内容复制到新数组中 class Arra ...

  8. Jetbranis学习资料之全家桶

    相信很多小伙伴,用的代码编辑器很多都是Jetbrains的,但好东西不可能免费的,而且找了很多激活码都是失效总是莫名其妙的就过期了.下面分享一个不错的激活码地址,比其他的应该更加可靠.本人实测目前支持 ...

  9. Ubuntu systemctl 查看管理系统启动项

    Ubuntu systemctl 查看系统启动项 列出所有启动项: sudo systemctl list-unit-files 会列出开启的和未开启的: 使用grep过滤一下开启的grep enab ...

  10. Nginx to start, restart, shutdown and upgrade

    1.start cd usr/local/nginx/sbin ./nginx 2.restart kill -HUP PID #主进程号或进程号文件路径 #或者使用 cd /usr/local/ng ...