[bzoj5194][Usaco2018 Feb][线段树]Snow Boots

P7988-[USACO21DEC] HILO G【set,线段树】 正题 题目链接:https://www.luogu.com.cn/problem/P7988 题目大意 给出一个长度为nnn的排列,开始有一个数字xxx,第一次询问回答x<a1x<a_1x<a1​(记为LOLOLO)或者x>a1x>a_1x>a1​(记为HIHIHI),然后继续往后问,如果aia_iai​不在范围内就不询问,求对于每个k∈[0,n],x=k+0.5k\in [0,n],x=k+0.5k∈[0,n],x=k+0.5时回答串中HILOHILOHILO的个数。 阅读详情

Description

到冬天了,这意味着下雪了!从农舍到牛棚的路上有N块地砖,方便起见编号为1…N,第i块地砖上积了fi英尺的雪 。在Farmer
John的农舍的地窖中,总共有B双靴子,编号为1…B。其中某些比另一些结实,某些比另一些轻便。具
体地说,第i双靴子能够让FJ在至多si英尺深的积雪中行走,能够让FJ每步至多前进di。Farmer John从1号地砖出
发,他必须到达N号地砖才能叫醒奶牛们。1号地砖在农舍的屋檐下,N号地砖在牛棚的屋檐下,所以这两块地砖都 没有积雪。帮助Farmer
John求出哪些靴子可以帮助他走完这段艰辛的路程。

Input

第一行包含两个空格分隔的整数N和B(1≤N,B≤10^5)。

第二行包含N个空格分隔的整数;第i个整数为fi,即i号地砖的积雪深度(0≤fi≤10^9)。输入保证f1=fN=0
下面B行,每行包含两个空格分隔的整数。第i+2行的第一个数为si,表示第i双靴子能够承受的最大积雪深度。
第i+2行的第二个数为di,表示第i双靴子的最大步长。输入保证0≤si≤10^9以及1≤di≤N-1

Output

输出包含N行

第i行包含一个整数:如果Farmer John能够穿着第i双靴子从1号地砖走到N号地砖,为1,否则为0

Sample Input

8 7

0 3 8 5 6 9 0 0

0 5

0 6

6 2

8 1

10 1

5 3

150 7

Sample Output

0

1

1

0

1

1

1

题解

考试模拟题。。
把靴子按深度排序,格子也按深度排
然后离线把格子一个一个加进去
如果当前的靴子的深度为5,那么格子深度<5的全部加入线段中
问题转化为维护最长一段没有加入的格子
然后直接线段树。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void write(int x)
{
    if(!x) return (void)puts("0");
    if(x<0) putchar('-'),x=-x;
    static short s[25],t;
    while(x) s[++t]=x%10,x/=10; 
    while(t) putchar('0'+s[t--]);
    putchar('\n');
}
struct ozy666
{
    int y,up,op;
}a[110000],b[110000];int n,m;
bool cmp(ozy666 n1,ozy666 n2){return n1.y<n2.y;}
struct node
{
    int lc,rc,l,r,mx;
    int lb,rb;//左边开始最长一段 右边开始最长一段 
}tr[210000];int trlen;
void bt(int l,int r)
{
    int now=++trlen;
    tr[now].l=l;tr[now].r=r;
    tr[now].mx=tr[now].lb=tr[now].rb=r-l+1;
    tr[now].lc=tr[now].rc=-1;
    if(l<r)
    {
        int mid=(l+r)/2;
        tr[now].lc=trlen+1;bt(l,mid);
        tr[now].rc=trlen+1;bt(mid+1,r);
    }
}
void upd(int now)
{
    int lc=tr[now].lc,rc=tr[now].rc;
    tr[now].mx=max(tr[lc].mx,tr[rc].mx);
    tr[now].mx=max(tr[now].mx,tr[lc].rb+tr[rc].lb);
    tr[now].lb=tr[lc].lb;
    if(tr[lc].lb==tr[lc].r-tr[lc].l+1)tr[now].lb=tr[lc].lb+tr[rc].lb;
    tr[now].rb=tr[rc].rb;
    if(tr[rc].rb==tr[rc].r-tr[rc].l+1)tr[now].rb=tr[rc].rb+tr[lc].rb;
}
void change(int now,int p)
{
    if(tr[now].l==tr[now].r)
    {
        tr[now].mx=tr[now].lb=tr[now].rb=0;
        return ;
    }
    int lc=tr[now].lc,rc=tr[now].rc;
    int mid=(tr[now].l+tr[now].r)/2;
    if(p<=mid)change(lc,p);
    else change(rc,p);
    upd(now);
}
int answer[110000];
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i].y=read(),a[i].op=i;
    for(int i=1;i<=m;i++)b[i].y=read(),b[i].up=read(),b[i].op=i;//保护 跳跃 
    sort(a+1,a+1+n,cmp);
    sort(b+1,b+1+m,cmp);
    bt(1,n);
    int LA;
    for(int i=1;i<=n;i++)
    {
        if(a[i].y>b[1].y){LA=i;break;}
        change(1,a[i].op);
    }
    if(tr[1].mx<b[1].up)answer[b[1].op]=1;
    else answer[b[1].op]=0;
    for(int i=2;i<=m;i++)
    {
        if(b[i].y==b[i-1].y)
        {
            if(tr[1].mx<b[i].up)answer[b[i].op]=1;
            else answer[b[i].op]=0;
        }
        else
        {
            for(int j=LA;j<=n;j++)
            {
                if(a[j].y>b[i].y){LA=j;break;}
                change(1,a[j].op);
            }
            if(tr[1].mx<b[i].up)answer[b[i].op]=1;
            else answer[b[i].op]=0;
        }
    }
    for(int i=1;i<=m;i++)write(answer[i]);
    return 0;
}
[USACO15DEC] Counting Haybale P 题解(线段树) 题目链接 题目描述 题目简单来说就是,给你n个数,并可以对其中任意一个区间进行如下操作: 给定一个连续区间,在该区间内的每个数都加上某个数 给定一个连续区间,找出该区间的最小数 给定一个连续区间,求出该区间的和 其实,把题目理解透彻之后,基本上就知道要求什么了。 没错,这是一道蓝题(提高+/省选-),但其实没有那么的难,只是代码实现上可能会有问题。 我个人感觉应该是绿题(晋级+/提高-)的难度。 解题思路 直接把线段树糊上去就行了,注意取最小值时懒标记的更新方法,还有就是开long lon 阅读详情

相关推荐

USACO试题精选.pdf

这个是USACO题库中选出来的一些题,覆盖了多方面的知识点,利于锻炼C++学者的算法,里面还有部分题解

bzoj5194 [Usaco2018 Feb]Snow Boots(离线+贪心+并查集)

都按S排序以后,每次把不能走的染黑,如果任意一段连续的黑色个数小于< d的话我就可以通过,否则不行。可以用并查集来维护最大子段和。复杂度O(nlogn)#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define ll long long #define

Icefox的博客 754

保姆级教程:用Code Blocks搞定中科蓝讯AB5768E蓝牙音响SDK开发环境(附资源包)

本文提供了一份详细的Code Blocks配置指南,帮助开发者快速搭建中科蓝讯AB5768E蓝牙音响SDK开发环境。从工具链安装、环境配置到工程导入和调试技巧,涵盖全流程避坑要点,特别适合K12开发板初学者。附资源包下载,助您高效完成蓝牙音响开发。

weixin_28692817的博客 448

[USACO18FEB]Snow Boots S(G题)

中文链接: 洛谷P4265 题意: 思路: dp题目:类似求完全背包的存在性。 因为靴子只能从上开始拿,而且又要丢弃靴子数最小, 那么可以 建dp数组dp[B][N]; dp[i][j] = 1表示用第i双靴子可以走到位置j; 数组元素初始化为-1,表示未达到。 读入数据时,从起点开始到第一个有雪的地方(j)前,dp[0][0~(j-1)]赋值为0,表示不用靴子可以走到的地方.然后两层循环搞定。...

qq_43651200的博客 470

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5573

洛谷 P4188 [USACO18JAN]Lifeguards (线段树)

#Problem 给 nnn 个区间,请你删去一个区间,问剩下区间并集最长为多少 #Solution 线段树维护区间覆盖长度… 然后每次删去一个区间看剩下的并集长度,再加上那个这个区间… 注意: 线段树求区间长度,要把区间定义为左闭右开,这样好做 只会插入线段,删去原有线段,因此不需要下放标记什么的 updateupdateupdate 时要判断此节点是不是被完全覆盖,而不能直接用左加右。因为没...

生活不易,多才多艺 536

第4章 Stata参数检验

目录 4.1单一样本T检验 案例延伸 4.2独立样本T检验 案例延伸 1.改变置信水平 2.在异方差假定条件下进行假设检验 4.3配对样本T检验 案例延伸 1.改变置信水平 4.4单一样本方差的假设检验 案例延伸 4.5双样本方差的假设检验 参数检验(Parameter Test)是指对参数的平均值、方差、比率等特征进行的统计检验。参数检验一般假设统计总体的具体分布为已知,但是其中一些参数或者取值范围不确定,分析的主要目的是估计这些未知参数的取值,或者对这些参数进...

qq_45112156的博客 1万+

[USACO08NOV] Light Switching G(线段树)

线段树 区间取反、区间查询。

zhujiangyuan2027的博客 1068

【C语言】一文带你拿捏分支和循环语句(一万字详细讲解)

if/switch语句、while/fo/do...while循环语句、goto语句详解

StackFrame 1233

【工具插件类教学】Unity翻书效果插件Book-Page Curl Pro教程

特征: • 从左到右和从右到左翻页 • 与画布缩放器 配合使用 • 可配置的自动翻转脚本 • 支持向页面 添加 UI 元素 • 支持透明页面 • 适用于“世界空间”画布

纯技术流日常开发商业开发记录总结等 3674

[USACO18FEB]Snow Boots G

[USACO18FEB]Snow Boots G 题意 现在有n块地砖,除了第一块地砖和最后一块地砖,其余每一块地砖都堆积了高度为a[i]的雪,你现在有b双鞋子,没双鞋子最多可以在高度为d的雪地上走s步,现在问你那些鞋子可以走完这段路。 思路 线段树(单点修改)+离线 (因为询问具有单调性,所以我们可以使用离线来做) 我们假设一个位置为1表示可以走,为0表示不可以走。我们在计算某双鞋子能否走过这段路,只需要判断当前情况下,这双鞋子能够走的步数是否大于连续的0的个数。 最开始,我们将所有的位置都设置为0,表示

MagicFromMe的博客 264

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7470

bzoj5194: [Usaco2018 Feb]Snow Boots(线段树)

题目传送门 。 解法: 线段树维护一个01序列。 0表示不可以跳。1表示可以跳。 那么每次只需要求最长一段连续的0的长度就行。 如果可以跳过去那么其他也可以跳过去。 如果跳不过去那就不行。 然后那这样每次询问都插岂不是会爆。 那离线一下咯。 询问排下序。 从小到大插。 代码实现: #include&lt;cstdio&gt; #include&lt;cstring&g...

Hanks_o的博客 563

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6289

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bzoj5194: [Usaco2018 Feb]Snow Boots (二分+并查集)

Problem 有 nnn 块砖,上面有厚度为 aiaia_i 的积雪 有 BBB 双靴子,他能走 didid_i 步,能走积雪小于 viviv_i 的积雪 Solution 我们可以对于每一双靴子,将积雪量大于靴子能承受的给 111,其余给 000。每个靴子能走 didid_i 步,因此最长连续 111 的长度大于靴子的步数就说明不能走到;反正可以。 问题转化为求最长连续 1...

生活不易,多才多艺 229

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[USACO3.1.4] 形成的区域 - 线段树/矩形切割

题目描述N 个不同的颜色的不透明的长方形 ( 1 <= N <= 100 ) 被放置在一张宽为:A、 长为:B 的白纸上。这些长方形被放置时,保证了它们的边于白纸的边缘平行。所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色。坐标系统的原点 ( 0,0 ) 设在这张白纸的左下角,而坐标轴则平行于边缘。输入格式按顺序输入放置长方形的方法。第一行输入的是那个放在底的长方形(即白纸)。 第 1

Bill_Yang_2016的博客 900

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch 线段树

BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch 线段树

-Claude 1592

[Usaco2003 Open]Lost Cows(线段树)

题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=2875 类似于poj上的一道题,具体记不得了。 算是线段树的一道基础题吧,单点更新问题。 sum[rt]记录前面所有的空闲位置的数目 sum[rt]=sum[rt 从后往前进行插入,每次插入之后记录插入的位置,并做一个标记,第一个数应该为最终未标记的那个数,然后

To be excellent! 572

USACO-Section1.2 Milking Cows [线段树]

2017-5-23 题目大意: 读入N个农民(1 <= N <= 5000)挤N头牛的工作时间列表, 求最长至少有一人在挤奶的时间段。 最长的无人挤奶的时间段。(从有人挤奶开始算起) 样例输入: 3 300 1000 700 1200 1500 2100 样例输出: 900 300 题解: 排序解决。按照农名开始挤牛奶的时间进行排序,问题转化为三个子问

mujinuist的博客 356

USACO Shaping Regions

1、呼。。。终于过了这道,考察离散化+线段树的区间修改。因为是零基础,所以专门跑到POJ找了一道相似的题目做(POJ 2528)。。。终于写出来了~ 2、所谓离散化,就是将无限空间映射到有限区域,通俗一点讲,就是只记录边界线。本题对x和y坐标均离散化,然后枚举x点并更新(合法的)x点对应的线段树(也就是说x要在该操作所包围的范围内),接着统计每种颜色的数量。要注意setv【0】初始值应设为1(表

483

【USACO】2008 Jan Haybale Guessing 猜数游戏

Haybale Guessing 猜数游戏 Description 为了提高智商,锻炼思维能力,奶牛设计了一个猜数游戏。游戏开始前,贝西会在牛棚后面摆上N个数字。所有数字排成一条直线,按次序从1到N编号。每个数字在1到10^9之间,没有两个数字是一样的。 游戏开始后,其他奶牛将会轮流询问贝西Q个问题,每个问题的格式都是一样的: “位置在Ql到Qr的数字中,最小的数字是多少?” 对每个问题,贝西

Bobby_Z的博客 881

洛谷 P2894 [USACO08FEB]酒店Hotel(线段树区间合并)

线段树维护区间内容的一道经典题,值得一做,废话少说,开始讲解吧。1.线段树维护内容 线段树维护一个最长区间。 线段树节点维护4个东西: 1.必须从左节点延伸的最长长度(lm) 2.必须从右节点延伸的最长长度(rm) 3.这一段的最长未占用长度(mm) 5.一个lazy标记,用于线段树的yy (laz = 0/1/2 <不需下放/需下放住房/需下放退房>) 2.区间内容的合并 对于

Guess_Ha的博客 857

【BZOJ3888】【Usaco2015 Jan】Stampede 线段树判区间覆盖

广告:#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.youkuaiyun.com/vmurder/article/details/44065939"); }题意:PoPoQQQPoPoQQQ站在原点上向y轴正半轴看,然后有一群羊驼从他眼前飞过。这些羊驼初始都在第二象限,尾巴在(Xi,Yi),头在

辗转山河弋流歌 1805

[USACO 2008 Nov G]Light Switching(线段树 + 懒标记)

这个就比较简单了,线段树维护一下区间01个数就行,用个懒标记表示是否区间反转。

qq_53398102的博客 199

洛谷P3113 [USACO14DEC]马拉松赛跑Marathon_Gold 线段树维护区间最大值 模板

如此之裸… Code: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn = 200000 + 3; int x[maxn], y[maxn...

weixin_30784501的博客 181
上一篇: [bzoj5168][线段树]贴海报
下一篇: [bzoj1257][乱搞]余数之和
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值