OvO http://acm.hdu.edu.cn/showproblem.php?pid=6076

  2017 Multi-University Training Contest - Team 4 - 1010

  O(n2)的DP的话,

  第二种情况,dp[i][j]=max(max(dp[i][j-1],dp[i-1][j])+1,dp[i-1][j-1]+1),这种情况下dp[i][j]是必然取dp[i-1][j-1]+1的,

  这样对于dp[n][n]就可以类似贪心地处理,每次搜索碰到第二种情况优先取第二种情况,否则就取第一种的最大值。

  而在第一种状况下,因为k很小,所以要搜索的状态其实是很少的。

  对于第二种状况,拿一个向量记录每条对角线上不符合状况二的情况,这样每次搜到第二种情况都可以跳跃着搜索,(在起跳点所在的这条对角线的向量上,对跳跃的落脚点进行二分)。

  这样总的情况其实是很少的,可以加一个记忆化

  (思路来源于 1,2,3

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector> using namespace std; typedef long long ll; const int M=6e4+44;
const int bas=M-22; int n,k;
int A[M],B[M],plcb[M];
map<int,map<int,int> > mp; //saves for case 1,case 2
vector<int> dia[M*2]; //diagonals saves void init()
{
mp.clear();
int i,j,valb,pb;
for(i=1-n;i<=n-1;i++)
dia[i+bas].clear();
for(i=1;i<=n;i++)
for(j=0;j<=k;j++)
{
valb=A[i]-j;
if(valb>0)
{
pb=plcb[valb];
dia[i-pb+bas].push_back(i);
}
valb=A[i]+j;
if(valb<=n)
{
pb=plcb[valb];
dia[i-pb+bas].push_back(i);
}
}
for(i=1-n;i<=n-1;i++)
sort(dia[i+bas].begin(),dia[i+bas].end());
} int deal(int wh,int now)
{
int i,j,li,ri,mid;
if(dia[wh].size()==0 || dia[wh][0]>now)
return now-min(now,now-(wh-bas));
li=0; ri=dia[wh].size();
while(li<ri-1)
{
mid=(li+ri)>>1;
if(dia[wh][mid]<now)
li=mid;
else
ri=mid;
}
return dia[wh][li];
} int dfs(int x,int y)
{
int i,j,tmp,ret,val1,val2;
if(x==0 || y==0)
return x+y;
if(abs(A[x]-B[y])<=k)
{
val1=mp[x-1][y];
if(val1==0) val1=dfs(x-1,y);
val2=mp[x][y-1];
if(val2==0) val2=dfs(x,y-1);
ret=1+min(val1,val2);
mp[x][y]=ret;
return ret;
}
else
{
tmp=x-deal(x-y+bas,x);
ret=tmp+dfs(x-tmp,y-tmp);
mp[x][y]=ret;
return ret;
}
} int main()
{
// freopen("数据\\1010.in","r",stdin);
// freopen("数据\\fxxl1010.out","w",stdout);
int i,j;
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&B[i]);
plcb[B[i]]=i;
}
init();
int ans=dfs(n,n);
printf("%d\n",ans);
}
return 0;
}

  

hdu 6076 Security Check的更多相关文章

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

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

  2. HDU 6076 Security Check DP递推优化

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

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

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

  4. HDU 6076 (动态规划)

    HDU 6076 Security Check Problem : 有两个长度为n的队列过安检,每个人有一个特征值.如果两个队列中的第一个人的特征值之差小于等于k,那么一次只能检查其中一个人,否则一次 ...

  5. hdu6076 Security Check 分类dp 思维

    /** 题目:hdu6076 Security Check 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 题意:有两个队列在排队,每一次警察可以检 ...

  6. 2017 多校4 Security Check

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

  7. Windows Directory ACL Security Check By ACL Baseline

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

  8. HDU 2888:Check Corners(二维RMQ)

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中 ...

  9. Windows Registry Security Check

    catalog . Windows注册表 . Windows注册表包含的攻击向量 . 注册表安全配置基线标定 1. Windows注册表 注册表(Registry,繁体中文版Windows称之为登录档 ...

随机推荐

  1. go语言开启go module

    export GO111MODULE=on //linux .MAC set GO111MODULE=on //Windows

  2. 【一个蒟蒻的挣扎】最小生成树—Kruskal算法

    济南集训第五天的东西,这篇可能有点讲不明白提前抱歉(我把笔记忘到别的地方了 最小生成树 概念:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的 ...

  3. linux常用终端命令(三)用户和权限

    三.用户权限相关命令 用户 和 权限的基本概念 用户管理 终端命令 组管理 终端命令 修改权限 终端命令 1.用户和权限的基本概念 1.1.基本概念 用户管理包括 用户 与 组 管理 linux系统中 ...

  4. gin框架博客实战教程2019web页面开发go语言实战博客开发

    视频教程: https://www.bilibili.com/video/av73698322?t=2400&p=5 资料下载地址(含数据库和main.go和controller里的代码) 注 ...

  5. IntelliJ IDEA Spring boot devtools 实现热部署

    一.spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动部署新代码. 二.原理 使用了两个ClassLoader,一个ClassLoader用来加载那些不会变 ...

  6. 反射获取config实体类属性并赋值

    /// <summary> /// 将实体类存入config /// </summary> /// <param name="enity">&l ...

  7. 不再显示广告案例(php操作cookie)

    1,页面简单结构搭建 ad.html <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  8. Winfrom 简单的进度条小程序

    使用Winform空间编写简单的进度条小程序: 所需控件:Lable 标签  TextBox  文本框  progressBar  进度条控件  timer 定时器 下面是源码及效果图: /// &l ...

  9. Nginx作为静态资源web服务之文件读取

    Nginx作为静态资源web服务之文件读取 文件读取会使用到以下几个配置 1. sendfile 使用nginx作为静态资源服务时,通过配置sendfile可以有效提高文件读取效率,设置为on表示启动 ...

  10. SQL*Loader 的使用sqlldr和sqluldr2方法详解

    oracle数据导出工具sqluldr2可以将数据以csv.txt等格式导出,适用于大批量数据的导出,导出速度非常快.导出后可以使用oracle loader工具将数据导入.简介:Sqluldr2:专 ...