/**
题目: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. hdoj-1301-Jungle Roads【最小生成树】

    Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  2. Spring框架学习(9)AOP技术理解与使用

    内容源自:AOP技术理解与使用 一.什么是AOP? aop技术是面向切面编程思想,作为OOP(面向对象编程)的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想. AOP底层也是 ...

  3. 极客技术专题【011期】:EasyUI初级教程

    来源:GBin1.com 技术专题:EasyUI初级教程 分享人:极客标签技术编辑 - html580(请站内关注分享人) 资深Web前端工程师,HTML580创始人,目前就职于广州一间软件公司.多年 ...

  4. 基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架

    功能介绍 跨语言通信 方便的使Java.Python.C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水平扩展,自动发现新的服务节点 能够兼容各种异常情况,如节点 ...

  5. 通过LR监控Linux服务器性能

    1)设置监控服务器要监控 UNIX 资源,必须配置 rstatd 守护程序.注意,可能已经配置了 rstatd守护程序,因为当计算机收到一个 rstatd 请求时,该计算机上的 inetd 自动激活r ...

  6. ES6 for...of循环

    1.for of const arr = ['red', 'green', 'blue']; for(let v of arr) { console.log(v); // red green blue ...

  7. Com与.Net互操作

    Com与.Net互操作 .Net调用Com组件主要分为两类:静态调用及动态调用.所谓静态调用:指通过tlbimp.exe命名产生Com组件在.Net环境下的包装类,然后通过这个包装类来访问Com组件. ...

  8. Android Studio Note

    1.中文乱码 很多同学都安装了Android Studio,但是发现中文是乱码,其实这个很好解决的.在IDE里点击File,选择Settings...快捷键是Ctrl+alt+s 在打开的窗口中,找到 ...

  9. ASP.NET MVC使用IoC

    也许你会问ASP.NET MVC为什么会爱上IoC? 相爱的理由常常很简单,就像一首歌中所唱——“只为相遇那一个眼神”. 而ASP.NET MVC爱上IoC只为IoC能实现MVC控制器的依赖注入. 下 ...

  10. 怎样使用CSS3实现书页(书本)卷角效果

    我们有时候想在页面显示一个公告或用户提示信息. 一个经常使用设计是使用书签形状. 我们能够给书签加入卷角效果.以使其更为逼真.所谓的"卷角"实际上能够用小角度倾斜的阴影效果来模拟. ...