[luogu1526]智破连环阵
(以下在描述复杂度时,认为$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]智破连环阵的更多相关文章
- luogu P1526 [NOI2003]智破连环阵 搜索+最大匹配+剪枝
LINK:智破连环阵 考试的时候 题意没理解清楚 题目是指一个炸弹爆炸时间结束后再放另一个炸弹 而放完一个炸弹紧接另一个炸弹.题目中存在然后二字. 这样我们可以发现某个炸弹只会炸连续的一段. 但是 由 ...
- 题解-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国间谍的侦察发 ...
- bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】
一个炸弹炸一个区间的武器,想到二分图匹配 但是直接dfs断点显然不行,预处理出dis[i]为i到m的至多值来最优性剪枝,并且标记ok[i][j]为炸弹i可以炸到j武器,mx[i][j]为i炸弹从j武器 ...
- P1526 [NOI2003]智破连环阵
目录 题意描述 算法分析 闲话 初步分析 具体思路 剪枝一 剪枝二 剪枝三 总结一下 代码实现 预处理 剪枝一 剪枝二 剪枝三 二分图匹配 代码综合 结语 又是被楼教主虐的体无完肤的一天 题意描述 在 ...
- ZJOI2017 Day1
私のZJOI Day1 2017-3-21 07:52:53 有人在暴力膜 苟-- 富贵 无相忘 ZJOI2017交流群 133135071 如果你足够厉害 如果你足够厉害 如果你足够厉害 其实完全可 ...
- 【NOI2003——搜索+二分图匹配优化】
A 文本编辑器 无旋treap真好看 B 木棒游戏 暴力神仙题 C 数据生成器 树的直径两端点为Y, Z D 智破连环阵 搜索+二分图匹配优化 第一次写欸 列一下 void dfs (int y,in ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- nginx配置禁止爬虫配置
1.在配置文件里添加禁止爬虫配置 server { ------ #添加如下内容即可防止爬虫 if ($http_user_agent ~* "qihoobot|Baiduspider|Go ...
- 如何通过 Serverless 轻松识别验证码?
作者 | 江昱 来源 | Serverless 公众号 前言 Serverless 概念自被提出就倍受关注,尤其是近些年来 Serverless 焕发出了前所未有的活力,各领域的工程师都在试图将 Se ...
- Server Tools(服务器工具)
服务器工具 1.发布 # Process: MXD 转 Web 地图 arcpy.MXDToWebMap_server("", "", "" ...
- 题解 [PA2019]Trzy kule
link Description 对于两个长度为 \(n\) 的 \(01\) 串 \(a_1,a_2,\dots,a_n\) 和 \(b_1,b_2,\dots,b_n\),定义它们的距离 \(d( ...
- 1. SSTI(模板注入)漏洞(入门篇)
好久没更新博客了,现在主要在作源码审计相关工作,在工作中也遇到了各种语言导致的一些SSTI,今天就来大概说一下SSTI模板注入这个老生常谈的漏洞 前言 模板引擎 模板引擎(这里特指用于Web开发的模板 ...
- Kotlin/Native KMM项目架构
一.什么是KMM? Kotlin Multiplatform Mobile ( KMM ) 是一个 SDK,旨在简化跨平台移动应用程序的创建.在 KMM 的帮助下,您可以在 iOS 和 Android ...
- 如何正确使用JMeter性能测试?紧扣面试实际要求
前段时间专门挑了一段时间在准备面试.经过两次面试后,有一些比较深刻的认识.对于企业要求来说,除了对专业理论知识考究之外,对测试工具这块也是看重的. 一.使用JMeter测试快速入门 1.线程组是什么 ...
- Visual Studio 安装 C++
Visual Studio 安装 C++
- 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放
[2021年10月22日·东莞]华为开发者大会 2021(Together)于今天正式开幕,华为在主题演讲中正式发布全新的HMS Core 6,向全球开发者开放7大领域的69个Kit和21,738个A ...
- I-Base62
I - Base62 PS:一个任意进制转换的大数问题 传送门:Base62 短除法原理: 20(10进制) => 202(3进制) 20 = (2 * 3 ^ 2 + 0 * 3 ^ 1 + ...