Codeforces Round #577 (Div. 2)  D. Treasure Hunting

这个一场div2 前面三题特别简单,这个D题的dp还是比较难的,不过题目告诉你了只能往上走,所以还是可以看出来这个是一个dp的。

然后对于每一段,肯定是从左到右或者从右到左这个是最优的,这里就是有一点点贪心的思想。

所以要我们首先要求出每一行的最大最小,然后就是开始转移。

题目要求只有一部分的列才可以竖直方向的走,这个让我就有点迷糊。

首先每一段向下转移,如果这个位置向下转移到的那个位置直接有直线可以竖着的走,

那么可以知道这个肯定是最优的,如果没有就只能找两边的了。

这个其实有点难写,看了别人的代码发现,这个可以用lower_bound 和 upper_bound 很巧妙的解决。

首先在一个数组里面存下可以走的每一列,然后还要存一个最小值-inf,和一个最大值 inf。然后排序一下。

然后就是找对于每一个区间,就是刚刚说的那个转移区间,(x,y) 注意 x不一定小于等于y

我们开始用lower_bound 找到大于等于x的最大值,如果没有大于等于x的那么就会找到inf,这个很自然会被舍去,然后upper_bound 就会找到区间左边的,

如果找到了大于等于的,那么用upper_bound会找到相同的位置,然后-1就是区间左边的,这个时候就判断一下,选哪个更优。

如果y>y 也是一样的,这个lower_bound 会找到两边的,如果中间有那么upper_bound也会找到。

这个之后还要加一点点东西,竖直距离和max[i]-min[i]

#include <cstring>
#include <queue>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 2e5 + ;
typedef long long ll;
int Max[maxn], Min[maxn], num[maxn], cnt;
ll dp[maxn][]; ll dis(int x,int y)
{
int l = *(lower_bound(num + , num + + cnt, x));
int r = *(upper_bound(num + , num + + cnt, x) - );
return min(abs(x - l) + abs(y - l), abs(x - r) + abs(y - r));
} int main()
{
int n, m, k, q, ans = ;
scanf("%d%d%d%d", &n, &m, &k, &q);
memset(Min, inf, sizeof(Min));
for(int i=;i<=k;i++)
{
int l, r;
scanf("%d%d", &l, &r);
Max[l] = max(Max[l], r);
Min[l] = min(Min[l], r);
ans = max(ans, l);
}
for(int i=;i<=q;i++)
{
int x;
scanf("%d", &x);
num[i] = x;
}
cnt = q;
num[++cnt] = inf; num[++cnt] = -inf;
sort(num + , num + + cnt);
if(Max[]==) Max[] = , Min[] = ;
dp[][] = Max[] * - Min[] - ;
dp[][] = Max[] - ;
//printf("ww %lld %lld\n", dp[1][0], dp[1][1]);
int x = ;
for(int i=;i<=n;i++)
{
//printf("i=%d\n", i);
if (Max[i] == ) continue;
dp[i][] = min(dis(Min[x], Max[i]) + dp[x][], dis(Max[x], Max[i]) + dp[x][]);
dp[i][] = min(dis(Min[x], Min[i]) + dp[x][], dis(Max[x], Min[i]) + dp[x][]);
//printf("dp[%d][0]=%lld dp[%d][1]=%lld\n", i, dp[i][0], i, dp[i][1]);
dp[i][] += abs(Max[i] - Min[i]) + i - x;
dp[i][] += abs(Max[i] - Min[i]) + i - x;
x = i;
//printf("dp[%d][0]=%lld dp[%d][1]=%lld\n", i, dp[i][0], i, dp[i][1]);
}
//printf("ans=%d\n", ans);
printf("%lld\n", min(dp[ans][], dp[ans][]));
return ;
}

Codeforces Round #577 (Div. 2) D. Treasure Hunting的更多相关文章

  1. Codeforces Round #577 (Div 2)

    A. Important Exam 水题 #include<iostream> #include<string.h> #include<algorithm> #in ...

  2. 矩阵拿宝物--Codeforces 1201D - Treasure Hunting Codeforces Round #577 (Div. 2)

    网上题解比较少,自己比较弱研究了半天(已经过了),希望对找题解的人有帮助 题目链接:https://codeforc.es/contest/1201/problem/D 题意: 给你一个矩形,起始点在 ...

  3. Codeforces Round #282 (Div. 1) A. Treasure 水题

    A. Treasure Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/494/problem/A ...

  4. 【枚举】【贪心】Codeforces Round #482 (Div. 2) B. Treasure Hunt

    题意:给你3个字符串,3个人各对自己的字符串执行n轮操作,每一次选择一个字符变为任意一个和原来不同的字符.最后问你谁能使自己的串中的任意重复子串出现的次数最大化. 显然只需关注字符而非子串. 枚举每个 ...

  5. Codeforces Round #577 (Div. 2) 题解

    比赛链接:https://codeforc.es/contest/1201 A. Important Exam 题意:有\(n\)个人,每个人给出\(m\)个答案,每个答案都有一个分值\(a_i\), ...

  6. Codeforces Round #577 (Div. 2) C. Maximum Median (模拟,中位数)

    题意:给你一个长度为奇数\(n\)的序列.你可以对任意元素加上\(k\)次\(1\),求操作后的中位数最大. 题解:先对序列进行排序,然后对中位数相加,如果中位数和后面的元素相等,就对后面所有和当前中 ...

  7. Codeforces Round #577 (Div. 2) C. Maximum Median

    题意:就是给一n(奇数)个元素数组,可以对它的元素执行k次+1操作,递增排序,求中位数最大是多少. 那我们在排完序之后,中位数前的元素可以不管它,只要对中位数后的操作就行,我们要判断和中位数相等的元素 ...

  8. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  9. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

随机推荐

  1. AJ学IOS 之tableView的下拉放大图片的方法

    AJ分享,必须精品 一:效果 tableview下拉的时候上部分图片放大会 二:代码 直接上代码,自己研究吧 #import "NYViewController.h" //图片的高 ...

  2. AJ学IOS(05)UI之360等下载管理器九宫格UI

    AJ分享,必须精品 先看效果 主要是完成了九宫格UI的搭建 代码 - (void)viewDidLoad { [super viewDidLoad]; //九宫格中每个格子的宽 #define kAp ...

  3. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十二)之Error Handling with Exceptions

    The ideal time to catch an error is at compile time, before you even try to run the program. However ...

  4. x86汇编之栈与子程序调用

    什么是栈 栈与普通数据结构所说的栈的概念是相似的,遵循后进先出原则.不同的是汇编中所说的栈是一个在内存中连续的保存数据的区域,也即是实际存在的内存区域,进栈和出栈遵循后进先出原则. 在x86架构中,栈 ...

  5. 【draft】Team project :Bing dictionary plug-in

    课后~ 开会调研开会调研开会~ 在和Bing词典负责人进行了可行性的深入磋商后,我们对本次选题有了更加清晰的认识~困难好多~然而终于敲定了项目内容,我们的目标是这样一款神奇的插件,它帮你记录下新近查询 ...

  6. cwyth(自动核销代码)

    财务一体化系统,自动核销大数据代码: import pymysql import random import time #指定数据库地址.用户.密码.端口,使用connect()方法声明一个Mysql ...

  7. bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+

    参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...

  8. python进入adb shell交互模式

    import subprocess #方法一:进入某个环境执行语句(adb shell),注意shell内部命令需要带\n,执行完后一定记得执行exit命令退出,否则会阻塞 obj = subproc ...

  9. tp5--相对路径和绝对路径

    首先,我们要先明白相对路径和绝对路径的理论: 绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\window ...

  10. 超详细步骤---Linux下的最新Git版本安装

    原文地址:https://blog.csdn.net/u010887744/article/details/53957613 [标注大头] 1.查看当前git版本:git --version 查看最新 ...