Description

B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone)。传说中,连环阵是一种永不停滞的自发性智能武器。但经过A国间谍的侦察发现,连环阵其实是由M个编号为1,2,…,M的独立武器组成的。最初,1号武器发挥着攻击作用,其他武器都处在无敌自卫状态。以后,一旦第i(1<=i< M)号武器被消灭,1秒种以后第i+1号武器就自动从无敌自卫状态变成攻击状态。当第M号武器被消灭以后,这个造价昂贵的连环阵就被摧毁了。为了彻底打击B国科学家,A国军事部长打算用最廉价的武器——炸弹来消灭连环阵。经过长时间的精密探测,A国科学家们掌握了连环阵中M个武器的平面坐标,然后确定了n个炸弹的平面坐标并且安放了炸弹。每个炸弹持续爆炸时间为5分钟。在引爆时间内,每枚炸弹都可以在瞬间消灭离它平面距离不超过k的、处在攻击状态的B国武器。和连环阵类似,最初a1号炸弹持续引爆5分钟时间,然后a2号炸弹持续引爆5分钟时间,接着a3号炸弹引爆……以此类推,直到连环阵被摧毁。显然,不同的序列a1、a2、a3...消灭连环阵的效果也不同。好的序列可以在仅使用较少炸弹的情况下就将连环阵摧毁;坏的序列可能在使用完所有炸弹后仍无法将连环阵摧毁。现在,请你决定一个最优序列a1、a2、a3…使得在第ax号炸弹引爆的时间内连环阵被摧毁。这里的x应当尽量小

Input

第一行包含三个整数:M、n和k(1<=M, n<=100,1<=k<=1000),分别表示B国连环阵由M个武器组成,A国有n个炸弹可以使用,炸弹攻击范围为k。以下M行,每行由一对整数xi,yi(0<=xi,yi<=10000)组成,表示第i(1<=i<=M)号武器的平面坐标。再接下来n行,每行由一对整数ui,vi(0<=ui,vi<=10000)组成,表示第i(1<=i<=n)号炸弹的平面坐标。输入数据保证随机、无误、并且必然有解。

Output

一行包含一个整数x,表示实际使用的炸弹数.

Sample Input

Sample Input 1
4 3 6
0 6
6 6
6 0
0 0
1 5
0 3
1 1
Sample Input 2
10 10 45
41 67
34 0
69 24
78 58
62 64
5 45
81 27
61 91
95 42
27 36
91 4
2 53
92 82
21 16
18 95
47 26
71 38
69 12
67 99
35 94

Sample Output

Sample Output 1
2

Sample Output 2
5
HINT
输出数据为NOI原数据
输出数据由楼教主代码制作
原题有spj 此题去掉spj 只输出最优解

HINT

NOI2003 Day2 T3  感谢sxb_201上传

正解:搜索+$dp$+二分图最大匹配。

丧心病狂的$zjo$竟然把这题出成考试题。。我敢说这是我见过的最玄学的搜索题。。

首先,我们发现每个炸弹肯定炸一段连续的区间。那么有一个很直观的暴力的思路,那就是枚举区间。对于每个区间,能够完全覆盖的炸弹向它连边,跑一遍二分图最大匹配就行了。

这样显然是过不了的,所以我们要剪枝。我们假设每个炸弹可以重复使用,那么我们算出当前武器开始的所有武器最少还需几个炸弹才能消灭。

这个用$dp$来预处理。设$can[p][i][j]$表示$p$号炸弹,是否能够炸$[i,j]$这个区间。那么设$dis[i]$表示炸$[i,m]$需要的最少炸弹,易知$dis[i]=min(dis[j]+1)$,$i<j<=m+1$且$can[p][i][j-1]=1$,$dis[m+1]=0$。这个我们预处理就能得出了。

最优性剪枝:$now+dis[i]>=ans$则剪枝,$now$为当前炸弹数。

可行性剪枝:我们可以每次直接在原图的基础上进行增广,如果当前点不能进行增广,就不用再往下搜索了。

然而这些剪枝还是不足以通过全部数据,我们不妨从可行性剪枝上入手。

我们可以尝试求出当前区间右端点的最大值$maxl$,那么显然,$maxl$及其之前的端点都是可行的。

我们发现这样可以很大程度地优化时间。首先,我们可以从$maxl$到$l$依次枚举右端点,减少搜索量;其次,我们可以只进行一次增广,因为$can[p][i][j]>=can[p][i][j+1]$,那么右端点为$maxl$时连的边,在右端点减小时同样也会出现,并不会影响答案。

如何求出$maxl$?首先我们要求出辅助数组$maxt[p][l]$,表示炸弹$p$从$l$开始能炸到的最远的点的编号,这个很容易预处理出来,就不再赘述。

注意到匈牙利算法的过程,一个炸弹能够使用有两种情况。首先是这个炸弹没有出现在匹配边上;其次是这个炸弹虽然出现在匹配边上,但是它能够通过增广以后和当前区间匹配。那么我们就可以使用$bfs$来解决这个问题,求出所有能够使用的炸弹(具体操作看代码吧。。),然后不断地取$maxt[p][l]$的最大值,就能求出$maxl$了。

这就是本题的两个重要剪枝,加上这两个剪枝以后极限数据也可以瞬间求解了。

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define N (110)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int can[N][N][N],maxt[N][N],g[N][N],dis[N],vis[N],lk[N],mt[N],x[N],y[N],u[N],v[N],q[N],n,m,k,cnt,ans; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void pre(){
for (RG int i=;i<=m;++i) x[i]=gi(),y[i]=gi();
for (RG int i=;i<=n;++i){
u[i]=gi(),v[i]=gi();
for (RG int j=;j<=m;++j)
g[i][j]=(u[i]-x[j])*(u[i]-x[j])+(v[i]-y[j])*(v[i]-y[j])<=k*k;
}
for (RG int p=;p<=n;++p){
for (RG int i=;i<=m;++i) can[p][i][i]=g[p][i],maxt[p][i]=g[p][i]?i:i-;
for (RG int i=;i<m;++i)
for (RG int j=i+;j<=m;++j){
can[p][i][j]=can[p][i][j-]&g[p][j];
if (can[p][i][j]) maxt[p][i]=j;
}
}
for (RG int i=m;i;--i){
dis[i]=inf;
for (RG int j=i;j<=m;++j)
for (RG int p=;p<=n;++p)
if (can[p][i][j]) dis[i]=min(dis[i],dis[j+]+);
}
return;
} il int hungry(RG int x){
for (RG int v=;v<=n;++v){
if (!g[x][v] || vis[v]==cnt) continue; vis[v]=cnt;
if (!lk[v] || hungry(lk[v])){ mt[x]=v,lk[v]=x; return ; }
}
return ;
} il void dfs(RG int l,RG int id){
if (l>m){ ans=id-; return; } if (id-+dis[l]>=ans) return;
++cnt; RG int LK[N],MT[N],h=,t=,maxl=l-;
for (RG int i=;i<=n;++i) if (!lk[i]) vis[i]=cnt,q[++t]=i;
while (h<t){
RG int x=q[++h]; maxl=max(maxl,maxt[x][l]);
for (RG int i=;i<id;++i)
if (g[i][x] && vis[mt[i]]!=cnt) vis[mt[i]]=cnt,q[++t]=mt[i];
}
memcpy(LK,lk,sizeof(LK)),memcpy(MT,mt,sizeof(MT));
for (RG int i=;i<=n;++i) g[id][i]=can[i][l][maxl]; ++cnt,hungry(id);
for (RG int r=maxl;r>=l;--r){
for (RG int i=;i<=n;++i) g[id][i]=can[i][l][r]; dfs(r+,id+);
}
memcpy(lk,LK,sizeof(lk)),memcpy(mt,MT,sizeof(mt)); return;
} il void work(){
m=gi(),n=gi(),k=gi(),pre(),ans=n;
dfs(,),printf("%d\n",ans); return;
} int main(){
File("boom");
work();
return ;
}

bzoj4622 [NOI 2003] 智破连环阵的更多相关文章

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

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

  2. luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝

    LINK:智破连环阵 考试的时候 题意没理解清楚 题目是指一个炸弹爆炸时间结束后再放另一个炸弹 而放完一个炸弹紧接另一个炸弹.题目中存在然后二字. 这样我们可以发现某个炸弹只会炸连续的一段. 但是 由 ...

  3. 题解-NOI2003 智破连环阵

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

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

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

  5. P1526 [NOI2003]智破连环阵

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

  6. [luogu1526]智破连环阵

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

  7. 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题

    2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...

  8. BZOJ 1509[NOI 2003]逃学的小孩 树形dp

    1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 995  Solved: 505[Submit][Status][ ...

  9. [NOI 2003] 逃学的小孩

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1509 [算法] 树的直径 [代码] #include<bits/stdc++. ...

随机推荐

  1. github上虽然已经有实现好的Char RNN

    前言 学习RNN的时候很多人应该都有看过Andrej Karpathy写的The Unreasonable Effectiveness of Recurrent Neural Networks,使用基 ...

  2. Python Day24

    AJAX 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作 ...

  3. AngularJs详细

    正经的来啦 (MVC) View(视图), 即 HTML. Model(模型), 当前视图中可用的数据. Controller(控制器), 即 JavaScript 函数,可以添加或修改属性. 修改了 ...

  4. 1、gitlab的理论知识

    2.1 svn与git对比 . svn git 分布式 不是 是 在线阅读 不支持 不仅支持,而且可以在线编辑 存储方式 按文件 按元数据 完整性 一般 优 离线工作 日志都没法看 完全没问题 分支 ...

  5. thinkphp5 join使用注意

    A表有id,name,time等字段, B表有id,type,uid,email,address等字段. A表中的id和B表中的uid对应. Db::table(A表)->alias('a') ...

  6. POJ3974 Palindrome Manacher 最长回文子串模板

    这道题可以$O(nlogn)$,当然也可以$O(n)$做啦$qwq$ $O(nlogn)$的思路是枚举每个回文中心,通过哈希预处理出前缀和后缀哈希值备用,然后二分回文串的长度,具体的就是判断在长度范围 ...

  7. bitnami-redmine Apache服务启动不起来

    方法一: 通过 netstat -a -o 查看端口占用情况,关闭调用相关端口的进程.  c:\> netstat -a -o  Active Connections  Proto  Local ...

  8. scau 8616 汽车拉力比赛

          上次我们过了二分图的最佳匹配,现在我们看一道题目,经典的二分图的最佳匹配题目 8616 汽车拉力比赛 时间限制:500MS  内存限制:1000K提交次数:71 通过次数:24 题型: 编 ...

  9. 湖南省第十二届大学生计算机程序设计竞赛 problem A 2016

    如果 a * b % 2016 == 0 如果a = 1 ,且 a * b % 2016 == 0 考虑一下a = 2017的时候 2017 * b = (2016 + 1) * b % 2016 = ...

  10. C# 读写XML文件的方法

    C# 读写XML文件的方法 一.写XML文件 XmlDocument xmlDocument = new XmlDocument();xmlDocument.AppendChild(xmlDocume ...