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. 使用rpm安装mysql 5.7和依赖们

    在安装mysql-server之前,需要安装相应的依赖,当前系统环境是CentOS7,需要安装3个依赖,mysql-community-common,mysql-community-libs,mysq ...

  2. Swoft 2.0.3 重大更新,发布优雅的微服务治理

     什么是 Swoft ? Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架.Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP ...

  3. 清除vs2005、vs2008起始页最近打开项目

    有时候vs2005起始最近打开项目过多很想清除掉,但打遍了也没找到清除选项在哪里,今天找到了方法,发上来和大家共享. 方法一手工操作方法:1)删除最近打开的文件运行regedit,打开HKEY_CUR ...

  4. vs code 快捷键设置:选中字母可以快速全部转换为大写或小写

    文件--->首选项--->键盘快捷方式--->搜索:"大写"--->点击"转换为大写"左侧的加号,然后设置快捷键后按enter即可完成添 ...

  5. MVC4学习要点记四

    一.使用原生SQL使用EF的一个优点就是自动帮我们生成SQL,这在常规情况下很方便,但有些情况下用EF却不适合.另外还有些特别复杂的语句,利用EF很难生成.所以,EF提供一组方法用来执行原生的SQL. ...

  6. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

  7. postman传数组参数,二维数组,多维数组

    一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,

  8. elementui按需加载

    定义一个ele.js文件 官网:https://element.eleme.io/#/zh-CN/component/quickstart // 方法1 import 'element-ui/lib/ ...

  9. 给没有连接因特网的centos使用yum安装其他软件(转)

    https://blog.csdn.net/bbg221/article/details/78360618 在centos上,使用yum安装软件很方便,比如安装gcc,java等, 但是在没有网络的情 ...

  10. react——使用this.setState({ })修改state状态值

    使用this.setState({  }) 还可以修改后追加传的参数 效果如下: this.setState({  })方法是异步的