(以下在描述复杂度时,认为$n$和$m$相同,因此一律使用$n$)

称第$i$个炸弹能匹配非空区间$[l,r]$,当且仅当$l$到$r$内所有武器都在$i$攻击范围内,且$r=m$或第$r+1$个武器不在$i$攻击范围内

(更通俗的表示即在第$l$个武器启动时,使用第$i$个炸弹恰好会攻击到第$r$个武器)

关于这个区间的匹配,显然可以在$o(n^{2})$的时间内预处理

下面,将$n$个武器划分为若干个区间,分别表示每一个炸弹所破坏的武器(恰好),爆搜来确定区间划分后,只需判定其是否合法,并用区间数对答案取$\min$即可

关于判定,将第$i$个炸弹向划分出的区间中能匹配的区间连边,判定最大匹配是否等于区间数即可

暴搜复杂度为$o(n^{2}2^{n})$(即每一个位置是否划分,以及二分图匹配),下面来考虑剪枝——

剪枝1:求出$[i,n]$这些武器,在允许重复利用炸弹的情况下的最少次数$g_{i}$

若当前划分出$now$个区间,最后一个区间右端点为$r$,最小答案为$ans$,那么若$now+g_{r+1}\ge ans$显然不需要搜索下去,直接返回即可

关于$g_{i}$的计算,即$g_{i}=\min_{炸弹j能匹配区间[i,k]}g_{k+1}+1$(初始$g_{m+1}=0$),复杂度为$o(n^{3})$

剪枝2:在搜索过程中,每一次划分出一个区间后,即在最终的二分图中新增一个点,根据二分图的过程,直接对其再求一次匹配,当某一次无法匹配直接退出即可

剪枝3:从后往前枚举右端点,在综合剪枝1和剪枝2的基础上,此优化也有一定的用处

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 struct point{
5 int x,y;
6 }a[N],b[N];
7 vector<int>v[N<<1];
8 int n,m,k,ans,g[N],Vis[N][N][N],mm[N][N<<1],vis[N<<1],match[N<<1];
9 int sqr(int k){
10 return k*k;
11 }
12 bool check(point x,point y){
13 return sqr(x.x-y.x)+sqr(x.y-y.y)<=sqr(k);
14 }
15 bool dfs(int k){
16 if (vis[k])return 0;
17 vis[k]=1;
18 for(int i=0;i<v[k].size();i++)
19 if ((!match[v[k][i]])||(dfs(match[v[k][i]]))){
20 match[k]=v[k][i];
21 match[v[k][i]]=k;
22 return 1;
23 }
24 return 0;
25 }
26 void dfs(int k,int s){
27 if (s+g[k]>=ans)return;
28 if (k>m){
29 ans=s;
30 return;
31 }
32 memcpy(mm[s],match,sizeof(mm[s]));
33 for(int i=m;i>=k;i--){
34 for(int j=1;j<=n;j++)
35 if (Vis[j][k][i])v[n+s+1].push_back(j);
36 memset(vis,0,sizeof(vis));
37 if (dfs(n+s+1)){
38 dfs(i+1,s+1);
39 memcpy(match,mm[s],sizeof(mm[s]));
40 }
41 for(int j=1;j<=n;j++)
42 if (Vis[j][k][i])v[n+s+1].pop_back();
43 }
44 }
45 int main(){
46 scanf("%d%d%d",&m,&n,&k);
47 for(int i=1;i<=m;i++)scanf("%d%d",&a[i].x,&a[i].y);
48 for(int i=1;i<=n;i++){
49 scanf("%d%d",&b[i].x,&b[i].y);
50 for(int j=1;j<=m;j++){
51 if (!check(b[i],a[j]))continue;
52 for(int k=j;k<=m+1;k++)
53 if ((k>m)||(!check(b[i],a[k]))){
54 Vis[i][j][k-1]=1;
55 break;
56 }
57 }
58 }
59 g[m+1]=0;
60 for(int i=m;i;i--){
61 g[i]=n;
62 for(int j=1;j<=n;j++)
63 for(int k=i;k<=m;k++)
64 if (Vis[j][i][k])g[i]=min(g[i],g[k+1]+1);
65 }
66 ans=n;
67 dfs(1,0);
68 printf("%d",ans);
69 }

[luogu1526]智破连环阵的更多相关文章

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

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

  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. bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】

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

  6. P1526 [NOI2003]智破连环阵

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

  7. ZJOI2017 Day1

    私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...

  8. 【NOI2003——搜索+二分图匹配优化】

    A 文本编辑器 无旋treap真好看 B 木棒游戏 暴力神仙题 C 数据生成器 树的直径两端点为Y, Z D 智破连环阵 搜索+二分图匹配优化 第一次写欸 列一下 void dfs (int y,in ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Knativa 基于流量的灰度发布和自动弹性实践

    作者 | 李鹏(元毅) 来源 | Serverless 公众号 一.Knative Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数:当请求量减少以后,自动 ...

  2. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  3. kivy 选择框

    from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import builder # 注册 ...

  4. oo第三单元学习总结

    OO第三单元小结 一.JML语言理论基础及工具链梳理 在本单元我们学习了JML语言的一些基础知识,能够让我们看懂简单的JML规格并写出对应代码, 主要用到的知识点有:   1.requires 该子句 ...

  5. oo第一次博客-三次表达式求导的总结与反思

    一.问题回顾与基本设计思路 三次作业依次是多项式表达式求导,多项式.三角函数混合求导,基于三角函数和多项式的嵌套表达式求导. 第一次作业想法很简单,根据指导书,我们可以发现表达式是由各个项与项之间的运 ...

  6. 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!

    正文字体大小:大 中 小 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑-帶你一次看懂! (2017-02-21 10:57:48) 转载▼ 标签: wi-fi速度 手機wi- ...

  7. 设计的MOS管三极管简单开关电路驱动能力不够1

    您需要 登录 才可以下载或查看,没有帐号?注册 x . ?& P' U5 r/ ~& `: B 用AOD409设计的开关电路为什么驱动能力不够,请大家帮忙分析一下原因啊.这个电路作用就 ...

  8. 你一定不知道的Unsafe用法

    Unsafe是什么 首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译过来是不安全的,这倒不是说这个类是不安全的,而是说开发人员使用Unsafe是不安全的,也就是不推 ...

  9. linux 蓝牙开发调试(rtl8821cs模块)

    刚调完rtl8821cs的wifi功能,项目需要打通蓝牙配网功能. 调试过程中遇到各种问题中间几乎放弃,倒腾了几天最后还是打通了,顺便记录下过程. 通信接口:SDIO @WiFi.Uart @BT;工 ...

  10. 最小的K个数 牛客网 剑指Offer

    最小的K个数 牛客网 剑指Offer 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. class Solution ...