hdu 6076 Security Check
题
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很小,所以要搜索的状态其实是很少的。
对于第二种状况,拿一个向量记录每条对角线上不符合状况二的情况,这样每次搜到第二种情况都可以跳跃着搜索,(在起跳点所在的这条对角线的向量上,对跳跃的落脚点进行二分)。
这样总的情况其实是很少的,可以加一个记忆化
#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的更多相关文章
- HDU 6076 - Security Check | 2017 Multi-University Training Contest 4
/* HDU 6076 - Security Check [ DP,二分 ] | 2017 Multi-University Training Contest 4 题意: 给出两个检票序列 A[N], ...
- HDU 6076 Security Check DP递推优化
Security Check Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
- 2016多校第4场 HDU 6076 Security Check DP,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 题意:现要检查两条队伍,有两种方式,一种是从两条队伍中任选一条检查一个人,第二种是在每条队伍中同 ...
- HDU 6076 (动态规划)
HDU 6076 Security Check Problem : 有两个长度为n的队列过安检,每个人有一个特征值.如果两个队列中的第一个人的特征值之差小于等于k,那么一次只能检查其中一个人,否则一次 ...
- hdu6076 Security Check 分类dp 思维
/** 题目:hdu6076 Security Check 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 题意:有两个队列在排队,每一次警察可以检 ...
- 2017 多校4 Security Check
2017 多校4 Security Check 题意: 有\(A_i\)和\(B_i\)两个长度为\(n\)的队列过安检,当\(|A_i-B_j|>K\)的时候, \(A_i和B_j\)是可以同 ...
- Windows Directory ACL Security Check By ACL Baseline
catalog . Windows NTFS ACL(MAC) Permission . How the System Uses ACLs . 服务器不安全ACL配置带来的攻击向量 . NTFS AC ...
- HDU 2888:Check Corners(二维RMQ)
http://acm.hdu.edu.cn/showproblem.php?pid=2888 题意:给出一个n*m的矩阵,还有q个询问,对于每个询问有一对(x1,y1)和(x2,y2),求这个子矩阵中 ...
- Windows Registry Security Check
catalog . Windows注册表 . Windows注册表包含的攻击向量 . 注册表安全配置基线标定 1. Windows注册表 注册表(Registry,繁体中文版Windows称之为登录档 ...
随机推荐
- 使用rpm安装mysql 5.7和依赖们
在安装mysql-server之前,需要安装相应的依赖,当前系统环境是CentOS7,需要安装3个依赖,mysql-community-common,mysql-community-libs,mysq ...
- Swoft 2.0.3 重大更新,发布优雅的微服务治理
 什么是 Swoft ? Swoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架.Swoft 能像 Go 一样,内置协程网络服务器及常用的协程客户端且常驻内存,不依赖传统的 PHP ...
- 清除vs2005、vs2008起始页最近打开项目
有时候vs2005起始最近打开项目过多很想清除掉,但打遍了也没找到清除选项在哪里,今天找到了方法,发上来和大家共享. 方法一手工操作方法:1)删除最近打开的文件运行regedit,打开HKEY_CUR ...
- vs code 快捷键设置:选中字母可以快速全部转换为大写或小写
文件--->首选项--->键盘快捷方式--->搜索:"大写"--->点击"转换为大写"左侧的加号,然后设置快捷键后按enter即可完成添 ...
- MVC4学习要点记四
一.使用原生SQL使用EF的一个优点就是自动帮我们生成SQL,这在常规情况下很方便,但有些情况下用EF却不适合.另外还有些特别复杂的语句,利用EF很难生成.所以,EF提供一组方法用来执行原生的SQL. ...
- Java学习 面向对象(下)——Java疯狂讲义th4
面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...
- postman传数组参数,二维数组,多维数组
一维数组: 传递: 接收: 二维数组: 传递: 接收: 依此类推,
- elementui按需加载
定义一个ele.js文件 官网:https://element.eleme.io/#/zh-CN/component/quickstart // 方法1 import 'element-ui/lib/ ...
- 给没有连接因特网的centos使用yum安装其他软件(转)
https://blog.csdn.net/bbg221/article/details/78360618 在centos上,使用yum安装软件很方便,比如安装gcc,java等, 但是在没有网络的情 ...
- react——使用this.setState({ })修改state状态值
使用this.setState({ }) 还可以修改后追加传的参数 效果如下: this.setState({ })方法是异步的