luogu4422 [COCI2017-2018#1] Deda[线段树二分]
这题我一年前的模拟赛考场还切过,现在就不会了。。好菜啊。
显然直接线段树拆成$\log n$个区间,然后每个区间在进行线段树二分即可。
UPD:复杂度分析。貌似是$O(n\log n)$的/yiw。每个区间线段树二分,左儿子min小于查询的x就走左儿子,右儿子min小于x就走右儿子,否则就不走,直到找到最早的一个区间,后面的区间直接返回不找力~。所以找出log个区间,只有一个区间进行二分,总的是两倍log,所以还是单log级别的。
这是一年前的code。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,INF=0x3f7f3f7f;
inline int _min(int a,int b){return a<b?a:b;}
inline int read(){
char c;int f=,x=;while(!isdigit(c=getchar()))if(c==)f=;
while(isdigit(c))x=(x<<)+(x<<)+(c^),c=getchar();return f?-x:x;
}
int minv[N<<];
char s[];
int n,q,x,k,ans,qr,ql;
#define l i<<1
#define r i<<1|1
void Update(int i,int L,int R){
if(L==R){minv[i]=k;return;}
int mid=L+R>>;x<=mid?Update(l,L,mid):Update(r,mid+,R);
minv[i]=_min(minv[l],minv[r]);
}//维护最小站点位置
int Find(int i,int L,int R){
if(minv[i]>k)return INF;
else if(L==R) return L;
int mid=L+R>>;return minv[l]<=k?Find(l,L,mid):Find(r,mid+,R);
}//这里就是如果ql,qr覆盖了当前区间就在这区间里找满足要求最小岁数
void Query(int i,int L,int R){
if(ql<=L&&qr>=R){ans=Find(i,L,R);return;}
int mid=L+R>>;
if(ql<=mid){Query(l,L,mid);if(ans!=INF)return;}//小细节,年龄小的已经找到就不用找右边了.
if(qr>mid)Query(r,mid+,R);
}
#undef l
#undef r
int main(){
qr=n=read(),q=read();memset(minv,INF,sizeof minv);//注意清零,想想为什么
while(q--){
scanf("%s",s);
if(s[]=='M')k=read(),x=read(),Update(,,n);
else k=read(),ql=read(),ans=INF,Query(,,n),printf("%d\n",ans==INF?-:ans);
}
return ;
}
还有单log做法,是hkk教的。。首先对于权值从小到大排序,把每种权值建一棵树,树的下标是序列下标,(显然这个是一个可持久化线段树,注意这样一个以权值建立线段树的方法在想不出的时候可以往这个上想想!),然后对于查询区间小于x的,直接在主席树上找1~x-1这些树上(实际是前缀和)最早的[L,R]有值处,这个的做法和复杂度分析也同上。
luogu4422 [COCI2017-2018#1] Deda[线段树二分]的更多相关文章
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- hdu4614 线段树+二分 插花
Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to N ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- Educational Codeforces Round 64 (Rated for Div. 2) (线段树二分)
题目:http://codeforces.com/contest/1156/problem/E 题意:给你1-n n个数,然后求有多少个区间[l,r] 满足 a[l]+a[r]=max([l, ...
- 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
随机推荐
- jQuery UI Widget(1.8.1)工作原理
/*! * jQuery UI Widget 1.8.1 * * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) * Dual l ...
- MemCache服务安装配置及windows下修改端口号
简述:memcached 开源的分布式缓存数据系统.高性能的NOSQL Linux 一.环境配置与安装 01.编译准备环境 yum install -y gcc make cmake autoconf ...
- [转帖]Kafka 原理和实战
Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读 · 读完需要 101 分钟 ...
- Ajax的使用及后台如何传参
Ajax的使用(此处为表单序列化方式) $.ajax({ type: 'post', data: $('#newPriorityForm').serialize(), dataType: 'json' ...
- 一个包含python和java环境的dockerfile
现在一个项目中遇到python调用java的jar包的环境.为了方便发布,编写了这个dockerfile,作为基础镜像. #this docker file is used to build runt ...
- 数据结构和算法总结(三):A* 寻路算法
前言 复习下寻路相关的东西,而且A star寻路在游戏开发中应用挺多的,故记录下. 正文 迪杰斯特拉算法 说起A*得先谈谈Dijkstra算法,它是在BFS基础上的一种带权值的两点最短寻路贪心算法. ...
- uni-app中picker组件的一个坑
这里直接贴出代码 <view class="goods-info-add fl-sw"> <view>运费模板:</view> <view ...
- javabean转成json字符首字母大写
今天写接口的时候有个需求将接口返回的json字符串首字母大写:{"SN":"","Result":""}格式, 只需要在 ...
- 解决npm ERR!Unexpected end of JSON input while paring near (解析附近时JSON输入意外结束)'...."^2.0.0-rc.0","glob"'等npm install错误
摘要 最近更新了一次node,但是更新后npm的命令总是会报 npm WARN deprecated fsevents@2.0.6: Please update: there are crash fi ...
- python打印菱形
1.分析:首先python,我们分析了菱形的成分.双喜鸟seo输入2时,打印三行菱形:输入3时,打印五行菱形.也就是说,根据输入数字A,打印第2a-1行的菱形.菱形由一个三角形和一个倒三角形组成,两个 ...