/**
题目:hdu6076 Security Check
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076
题意:有两个队列在排队,每一次警察可以检查其中一个队的队首的一个人,或者两个队的队首同时检查(两个队首的人满足abs(a[i]-b[j])>k)
每检查一次需要1分钟,求警察检查完所有的人需要的最少时间。
思路:一眼看过去可以定义dp[i][j]表示第一个队列[1,i],第二个队列[1,j]检查完需要的最少时间。但是i,j太大了。
看了官方题解是这样做的,由于k比较小,如果abs(a[i]-b[j])<=k,那么只可以二选一去检查一个人。
这个时候可以dp记忆化,第一维记忆i,第二维记忆a[i]-b[j]+k;来唯一标识该状态。(两个队列都是[1,n]的排列)
如果abs(a[i]-b[j])>k;则两个队队首同时检查最佳。如果检查完该次之后还是满足abs(a[i]-b[j])>k,那么仍然同时检查。
为了加快速度,所以用vector维护一个i和j的一个确定偏移量时候,满足abs(a[i]-b[j])<=k的i位置,这样可以二分下一次出现abs(a[i]-b[j])<=k的i位置,
那么这个i和前面那个i之间的区间就是abs(a[i]-b[j])>k的匹配,可以跳跃到二分后的i。
总时间复杂度为O(n*k*lg(n)) */
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int N = 6e4+;
const int mod = ;
const int INF = 0x3f3f3f3f;
int n, k;
int a[N], b[N], pos[N];
int dp[N][];
vector<int> v[N*];
int dfs(int i,int j)
{
if(i==||j==) return i+j;
if(abs(a[i]-b[j])<=k){
int &res = dp[i][a[i]-b[j]+k];
if(~res) return res;
return res = min(dfs(i-,j),dfs(i,j-))+;
}
auto it = upper_bound(v[i-j+n].begin(),v[i-j+n].end(),i);
if(it==v[i-j+n].begin()) return max(i,j);///一直到头都没有abs(a[i]-b[j])<=k的。
it--;
return dfs(*it,j-(i-*it))+i-*it;///[*it + 1, i]这个区间和[j-(i-*it)+1,j]这个区间对应位置满足abs(a[i]-b[j])>k,所以可以快速处理。
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&k);
for(int i = ; i <= n; i++) scanf("%d",&a[i]);
for(int i = ; i <= n; i++){
scanf("%d",&b[i]);
pos[b[i]] = i;
}
for(int i = ; i <= *n; i++){
v[i].clear();
}
for(int i = ; i <= n; i++){
for(int j = a[i]-k; j <= a[i]+k; j++){
if(j>=&&j<=n){
v[i-pos[j]+n].push_back(i);
}
}
}
memset(dp, -, sizeof dp);
printf("%d\n",dfs(n,n));
}
return ;
}

hdu6076 Security Check 分类dp 思维的更多相关文章

  1. HDU 6076 Security Check DP递推优化

    Security Check Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  2. 2017 多校4 Security Check

    2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...

  3. HDU 6076 - Security Check | 2017 Multi-University Training Contest 4

    /* HDU 6076 - Security Check [ DP,二分 ] | 2017 Multi-University Training Contest 4 题意: 给出两个检票序列 A[N], ...

  4. 2016多校第4场 HDU 6076 Security Check DP,思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 题意:现要检查两条队伍,有两种方式,一种是从两条队伍中任选一条检查一个人,第二种是在每条队伍中同 ...

  5. Windows Directory ACL Security Check By ACL Baseline

    catalog . Windows NTFS ACL(MAC) Permission . How the System Uses ACLs . 服务器不安全ACL配置带来的攻击向量 . NTFS AC ...

  6. cf1153D 树形dp+思维

    一千八的题也不会做了呜呜呜 size[u]表示结点u下的叶子结点, 思维:可以想到一个子树对其父亲会有一个消耗值 考虑一个点如果是max,那么其最大值可以是size[u]-p,p是消耗值最小的子树 一 ...

  7. HDU 4826 (分类DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. E. The Contest ( 简单DP || 思维 + 贪心)

    传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...

  9. 【树形dp 思维题】HHHOJ#483. NOIP司马懿

    要注意利用一些题目的特殊条件吧. 题目大意 有一颗$n$个点带点权$a_i$的树,$q$次询问树上是否存在长度为$l$的路径. $n,q,l\le 10^5,0 \le a_i \le 2$ 题目分析 ...

随机推荐

  1. dubbo forbid 注意的几种方式

    1.检查所调用的项目模块是否起来了 2.如果起来后,检查该模块配置是否正确 3.服务端起来后与管理端的项目内容不一致(比如服务端增加了东西,管理端没有更新)

  2. automake连载---关于两个文件configure.in和Makefile.am的编写

    http://blog.csdn.net/shanzhizi/article/details/30251763 automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Mak ...

  3. 使用jstack和TDA进行java线程dump分析

    转载:http://blog.csdn.net/everlasting_188/article/details/51943095 1.jstack重点关注 命令行:jstack [-l][F] pid ...

  4. 云计算之路-试用Azure:竟然无法重置虚拟机的管理员密码

    在忘记管理员密码的情况下,可以远程重置服务器的管理员密码是云计算服务的一个优势,这是使用自己的物理服务器无法实现的. 但是,在使用Azure的时候,我们找遍Azure管理控制台也没找到可以重置虚拟机( ...

  5. IP地址冲突排查

    普通ARP请求报文(查找别人的IP地址,比如:我需要10.1.1.2的MAC地址,10.1.1.2是别人的IP)广播发送出去,广播域内所有主机都接收到,计算机系统判断ARP请求报文中的目的IP地址字段 ...

  6. Android fragment 切换载入数据卡顿问题

    接着上一篇项目的进度.上一篇讲了怎样利用fragment来实现下拉菜单.公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法.但载入的数据太多.用户从一个界面 ...

  7. CentOS下配置HTTPS訪问主机并绑定訪问port号

    系统环境: Linux: CentOS release 6.5 (Final) LAMP 步骤 1.lamp开启ssl # yum install openssl mod_ssl -y # 安装ope ...

  8. 加加减减(你真的懂++--吗) C#

    目录  TOC \o "1-3" \h \z \u 自增量. PAGEREF _Toc456268662 \h 1 08D0C9EA79F9BACE118C8200AA004BA9 ...

  9. python 静态成员变量

    python 静态成员变量 python 也可以定义静态成员变量,就是类的变量. 注意python的静态成员变量只能通过 类.变量名 的形式获取 class A: a1 = 0 def __init_ ...

  10. HTML5学习笔记简明版(5):input的type超级类型

    HTML5为input的type类型添加了多种枚举值,用来表达不同的意思.同事具有验证功能,假设格式不正确,浏览器将原始提供错误提示,堪称超级牛X啊,详细例如以下: Keyword Data type ...