众所周知,能用线段树做的题一定可以暴力

但考场上也只能想到暴力了,毕竟还是对线段树不熟练。

deda

描述

有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下车,D Y B代表询问年龄大于等于B且在第Y站(包含第Y站)以前下车的年龄最小的小孩,如果不存在,则输出-1。

.

输入

输入的第一行包含正整数N和Q,孩子的数量和询问的数量。

接下来Q行,每行3个值,第一个值为M或者D,询问有两种分别用M和D表示,M表示下车操作,D表示询问

如果是M X A,那么三个值的含义是:M X A代表在第X站时年龄为A的小孩会下车

如果是D Y B,代表询问年龄大于等于B且在第Y站(包含第Y站)以前下车的年龄最小的小孩,如果不存在,则输出-1。

所有询问都对应着不同的孩子,输入中至少有一行是询问的问题。

.

输出

对于每个询问的问题,输出答案。如果没有答案,输出-1。

.

分数分布

对于100%的数据:2≤N,Q≤200000,1≤X,Y≤1,000,000,000,1≤A,B≤N。

.

样例输入1

3 4

M 10 3

M 5 1

D 20 2

D 5 1

.

样例输出1

3

1

.

样例输入2

10 10

M 20 10

D 1 9

M 2 3

D 17 10

M 20 2

D 8 2

M 40 1

D 25 2

M 33 9

D 37 9

样例输出2

-1

-1

3

2

9

先来说说我的暴力做法吧(虽然这个做法只能40分,而且写出来有点蠢)

这道题我的第一反应是离线做,将每个询问的坐标从小到大排序依次处理,这样就可以保证"\(X<Y\)"这个条件了。

然而正解却直接用的是线段树。。。

根据数据范围,线段树表示的区间不能是坐标(因为1≤X,Y≤1,000,000,000)。所以我们可以用L-R来表示年龄为L岁到R岁的小孩中,他们下车的位置,坐标最小的那一个。

为什么是坐标最小的那一个呢,因为在询问中,

D Y B代表询问年龄大于等于B且在第Y站(包含第Y站)以前下车的年龄最小的小孩

既然要在第\(Y\)站之前,那么存进最小的位置肯定不会错。在查询时,我们只需要判断在当前区间\(L-R\)中,它的最小位置X是否小于\(Y\),如果是小于,我们继续,如果是大于,则return掉。

详情请见代码(线段树这种东西,不看代码是懂不了的)

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std; #define N 200010 int n,m,minv[N*10],x,age,ql,qr,ans=N+10;
char a; void Insert(int i,int L,int R) { //插入操作
if(L==R) {minv[i]=x; return ; }
int mid=(L+R)/2;
if(age<=mid) Insert(i*2,L,mid);
else Insert(i*2+1,mid+1,R);
minv[i]=min(minv[i*2],minv[i*2+1]);
} int Find(int i,int L,int R) {
if(minv[i]>x) return N+10;
if(L==R) return L; //L-R表示的年龄,所以要返回这个答案
int mid=(L+R)/2;
if(minv[i*2] <= x ) return Find(i*2,L,mid);
else return Find(i*2+1,mid+1,R);
} void Query(int i,int L,int R) {
if(ql<=L && qr>=R) {ans=Find(i,L,R); return ;} //找到符合条件的区间
int mid=(L+R)/2;
if(mid>=ql) {Query(i*2,L,mid); if(ans!=N+10) return ;}//如果找到了答案,那么
if(qr>mid) Query(i*2+1,mid+1,R); //(mid+1)-R的区间里的答案只会更大
} //所以return 掉 int main() {
memset(minv,0x3f,sizeof(minv));
cin>>n>>m;qr=n;
for(int i=1;i<=m;i++) {
cin>>a>>x>>age;
if(a=='M') Insert(1,1,n);
else { ql=age; Query(1,1,n); if(ans==N+10) cout<<"-1"<<endl; else cout<<ans<<endl; }
ans=N+10;
}
}

这道题的难点我认为是将l-r区间表示为年龄l-r的小朋友。

因为在平常线段树中,我们是在节点中存的答案,而这道题的做法却不一样。所以线段树是一个十分灵活的数据结构。

[COCI2017.1]Deda —— 解锁线段树的新玩法的更多相关文章

  1. 告别尬聊,解锁秀场+社交新玩法(内含源码+Demo)

    直播已成为用户的生活习惯之一 艾媒咨询数据显示:2021年直播用户规模达到6.35亿人,在线直播用户以年轻群体为主,24岁及以下用户占比49%,30岁以下用户接近8成. 众所周知,Z世代用户是一个社交 ...

  2. 自定义 checkbox 新玩法 ?

    自定义 checkbox 新玩法 ? 第一步:selector 编写 drawable/selector_checkbox_voice.xml <?xml version="1.0&q ...

  3. 【转帖】Moodle平台的5个新玩法

    [玩坏Moodle平台]Moodle平台的5个新玩法 1.RSS订阅 Moodle平台可以导入外部博客(或其他提供RSS的服务),并显示在Moodle内置的博客系统中.无论是自己的个人网站还是他人的博 ...

  4. Odoo 库存管理-库存移动(Stock Move)新玩法

    库存移动(Stock Move)新玩法 Odoo的库存移动不仅仅是存货在两个“存货地点”之间的移动的基本概念了,他们可以被“串联”在一起,可以用来生成或改变其对应的拣货单 (Picking).链式库存 ...

  5. MySQL高可用新玩法之MGR+Consul

    前面的文章有提到过利用consul+mha实现mysql的高可用,以及利用consul+sentinel实现redis的高可用,具体的请查看:http://www.cnblogs.com/gomysq ...

  6. 摹客iDoc「标注」新玩法!这些细节让你爱不释手(201903-2版本更新)

    哈喽小伙伴们,我们又见面啦!没错,小摹就是来告诉大家:摹客iDoc又双叒叕升级了!这次又上线了许多新玩法,在此之前,小摹先带大家温习一下iDoc以往的知识点: 攻城狮查看标注的利器 —— 标注信息智能 ...

  7. Chrome 控制台新玩法-向输出到console的文字加样式

    Chrome 控制台新玩法-向输出到console的文字加样式 有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的文字 ...

  8. Github 新玩法 -- Profile ReadMe

    Github 新玩法 -- Profile ReadMe Intro 今天刷 Github 的时候偶然发现一个新的玩法,Github Profile ReadMe,可以在个人的 Profile 页面展 ...

  9. WEB安全新玩法 [1] 业务安全动态加固平台

    近年来,信息安全体系建设趋于完善,以注入攻击.跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解.但是,Web 应用的业务功能日益丰富.在线交易活动愈加频繁,新的安全问题也随之呈现:基于 ...

随机推荐

  1. [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)

    [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...

  2. HDU-2068 RPG的错排(组合, 错排)

    RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. BlockingQueue 阻塞队列(生产/消费者队列)

    1:BlockingQueue的继承关系 java.util.concurrent 包里的 BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection Blo ...

  4. 从ES6重新认识JavaScript设计模式: 装饰器模式

    1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...

  5. Hls平台实现sobel算法(一)

    索贝尔(Sobel)算子主要用于边缘检测,根据像素点的上下.左右邻点的灰度加权差与阈值进行比较,在边缘处达到极值的方法实现边缘检测. -------------序 一.原理性运行 流水线操作,将输入图 ...

  6. 修复线上bug

    1,git branch new_branch 2,git push origin new_branch 以上是线上地址操作,以下是本地仓库操作 3,git fetch 4,git checkout ...

  7. asp.net webapi自定义输出结果类似Response.Write()

    asp.net webapi自定义输出结果类似Response.Write()   [HttpGet] public HttpResponseMessage HelloWorld() { string ...

  8. jQuery中attr()和prop()及removeAttr()和removeProp()的区别

    在jquery1.6之前的所有版本中设置和获取元素属性(固有属性和自定义属性)都使用attr方法,后来单独把设置和获取元素固有属性单独做成了prop()方法. 一般来说: 对于HTML元素本身就带有的 ...

  9. 调用SM30数据表维护的函数

    相关文章:http://www.cnblogs.com/caizjian/p/3248499.html 1.se11进去新建一个数据表 2.se55进去生产表维护 3.sm30进去维护数据表 4.se ...

  10. iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

    依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...