前言

\(ZHK\)私人博客体验更佳

这道题目,\(n<=10^5\),显然在暗示我们使用\(n \log n\)的做法,我就是用了一个简单的贪心,通过了此题。

正文

在这道题中,我们发现,可以把 \(Bessie\) 每次走的路看成是对序列的一段区间染色。

for(int i=1;i<=n;i++){
int x;char y;
read(x);cin>>y;
a[i].l=position;
if(y=='L')position-=x;//Bessie往左走
else position+=x;//Bessie往右走
a[i].r=position;
if(a[i].l>a[i].r)swap(a[i].l,a[i].r);
}

这里的 \(a\)数组是一个结构体——\(node\)

const int MAXN=1e5+10;
struct node{
int l,r;//每次染色的左端点和右端点
bool operator<(const node&b)const{
return l<b.l;//按左端点从小到大排序
}
}a[MAXN];

之后,我们就要说真正的思路了,我们对于 \(a\) 序列排序后,会有这样一个画面。

我们定义两个变量——\(lft\)和\(rgt\),记录可能区间的左端点和右端点。

这里面我们记录的是有可能和下面相交的区间,什么意思?比如那张图,我们标一下号

当我么扫描第 \(1\) 个区间时,我们发现,之后有可能被覆盖到的区间是 \(lft=0,rgt=15\)。

当我们继续扫描,到第 \(2\) 个区间时,我们发现,之后可能被覆盖到的区间是 \(lft=15,rgt=18\)。

可能有人会问,\(5\)~\(15\) 这段消失,我们还能理解,但是为什么 \(0\)~\(5\) 这段也没了呢,因为第 \(2\) 个区间的\(l\)都大约 \(0\) 了,之后的区间肯定就更大于 \(0\) 了,我们是按 \(l\) 从小到大排序的啊。

所以,我可以放一下代码了:

for(int i=2;i<=n;i++)
if(a[i].r>lft){//如果跟可能被覆盖到的区间有交
a[i].l=max(a[i].l,lft);//这里是使得之后的代码可以少写一点,因为显然,a[i].l<lft,a[i].l~lft这1段也没有用了
if(a[i].r>rgt){//比之前的右端点大
ans+=rgt-a[i].l;//从rgt到a[i].l
lft=rgt;//之前的右端点显然就是左端点,显然,新的可能被覆盖到的区间就是之前的rgt~a[i].r
rgt=a[i].r;//更新右端点
}else{//比之前的右端点小
ans+=a[i].r-a[i].l;//从a[i].r到a[i].l
lft=a[i].r;//更新左端点
}
}

总结

我们先来看一下完整的代码:

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}//快读
template<typename T>void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}//快写
const int MAXN=1e5+10;
struct node{
int l,r;//每次染色的左端点和右端点
bool operator<(const node&b)const{
return l<b.l;//按左端点从小到大排序
}
}a[MAXN];
int position,ans,lft,rgt,n;
int main(){
read(n);
for(int i=1;i<=n;i++){
int x;char y;
read(x);cin>>y;
a[i].l=position;
if(y=='L')position-=x;//Bessie往左走
else position+=x;//Bessie往右走
a[i].r=position;
if(a[i].l>a[i].r)swap(a[i].l,a[i].r);
}sort(a+1,a+n+1);//排序
lft=a[1].l;rgt=a[1].r;//给lft和rgt赋上初值
for(int i=2;i<=n;i++)
if(a[i].r>lft){//如果跟可能被覆盖到的区间有交
a[i].l=max(a[i].l,lft);//这里是使得之后的代码可以少写一点,因为显然,a[i].l<lft,a[i].l~lft这1段也没有用了
if(a[i].r>rgt){//比之前的右端点大
ans+=rgt-a[i].l;//从rgt到a[i].l
lft=rgt;//之前的右端点显然就是左端点,显然,新的可能被覆盖到的区间就是之前的rgt~a[i].r
rgt=a[i].r;//更新右端点
}else{//比之前的右端点小
ans+=a[i].r-a[i].l;//从a[i].r到a[i].l
lft=a[i].r;//更新左端点
}
}
write(ans);//输出
return 0;
}

补充一下正确性证明:

实际上作者想到这个方法的时候觉得显然是对的

其实主要就是为什么要 \(lft=a[i].r\) 可能有人对此有点问题,我来解释一下

\(\therefore\) 我们是按从小到大对 \(a\) 数组进行排序,也就是 \(a[i+1].l \geq a[i].l\),而 \(a[i].l>lft\)

\(\because\) \(a[i+1].l>lft\)。

题解 P2070 【刷墙】的更多相关文章

  1. P2070 刷墙 (洛谷)

    题目描述 Farmer John已经设计了一种方法来装饰谷仓旁边的长栅栏(把栅栏认为是一根一维的线).他把一只画刷绑在他最喜爱的奶牛Bessie身上,之后就去喝一杯冰水,而Bessie隔着栅栏来回走, ...

  2. 关于How,刷墙和亲戚

    对于需求而言,最宏观的概念是六字诀: Who->Where->Which->How->End->Effect:谁(Who)在什么地方(Where),对那个对象(Which ...

  3. 题解【洛谷P2070】刷墙

    题面 将每一次移动的距离进行差分,前缀和判断移动的距离是否\(\geq 2\)即可. #include <bits/stdc++.h> #define itn int #define gI ...

  4. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  5. 《WPF程序设计指南》读书笔记——第2章 基本画刷

    1.Color结构 using System; using System.Windows; using System.Windows.Input; using System.Windows.Media ...

  6. 淘宝PK京东:哥刷的不是广告,刷的是存在

    冯强/文 (昨晚看阿根廷vs瑞士时手机上敲的,看完太激动忘发了,现配了图发上来) 这两天,关于京东.淘宝渠道下沉的新闻中,两家略带喜感的农村墙体广告在互联网上传播,例如以下图: 京东这图片,越看越像P ...

  7. CF1132.Educational Codeforces Round 61(简单题解)

    A .Regular Bracket Sequence 题意:给定“((” , “()” ,  “)(”,  “))”四种,问是否可以组成合法括号匹配 思路:设四种是ABCD,B可以不用管,而C在A或 ...

  8. CF448C Painting Fence (分治递归)

    Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...

  9. POJ 1681 Painter's Problem (高斯消元)

    题目链接 题意:有一面墙每个格子有黄白两种颜色,刷墙每次刷一格会将上下左右中五个格子变色,求最少的刷方法使得所有的格子都变成yellow. 题解:通过打表我们可以得知4*4的一共有4个自由变元,那么我 ...

随机推荐

  1. 从Note 5看三星大招 究竟能不能秒杀iPhone

    5看三星大招 究竟能不能秒杀iPhone" title="从Note 5看三星大招 究竟能不能秒杀iPhone"> 从当年HTC发布第一代Android手机G1开始 ...

  2. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  3. 使用TensorFlow训练自己的语音识别AI

    这次来训练一个基于CNN的语音识别模型.训练完成后,我们将尝试将此模型用于Hotword detection. 人类是怎样听懂一句话的呢?以汉语为例,当听到"wo shi"的录音时 ...

  4. LeetCode~941.有效的山脉数组

    941.有效的山脉数组 给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false. 让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组: A.length > ...

  5. AAAI 2020论文分享:通过识别和翻译交互打造更优的语音翻译模型

    2月初,AAAI 2020在美国纽约拉开了帷幕.本届大会百度共有28篇论文被收录.本文将对其中的机器翻译领域入选论文<Synchronous Speech Recognition and Spe ...

  6. shell编程1:变量的使用与例子

    一.Shell脚本的执行通常可以采用以下几种方式: 1):bash script-name或sh script-name(推荐使用) 2):path/script-name 或./script-nam ...

  7. 7-19 计算有n个字符串中最长的字符串长度 (40 分)

    编写程序,用于计算有n(1<n<10)个字符串中最长的字符串的长度.前导空格不要计算在内! 输入格式: 在第一行中输入n,接下的每行输入一个字符串 输出格式: 在一行中输出最长的字符串的长 ...

  8. 续python学习(一)

    接上面没写完的知识点继写. 当然,这些知识点都很简单,可能没必要花费太多时间去记忆,多写写代码就会了. 5.字符串的使用.索引和切片是字符串主要的两个应用.索引:顾名思义就是找出某个字符在一个字符串中 ...

  9. Centos 安装rabbitmq

    此处是通过源码进行安装的rabbitmq,参考:http://www.cnblogs.com/huangxincheng/p/6006569.html 1.源码包下载 ① erlang : http: ...

  10. cmd 输入输出

    cmd 输入输出 首先在编写如: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> vo ...