计蒜客16492 building(二分线段树/分块)
题解:
考虑用线段树维护楼的最大值,然后这个问题就很简单了。
每次可以向左二分出比x高的第一个楼a,同理也可以向右二分出另一个楼b,如果a,b都存在,答案就是b-a-1。
注意到二分是可以直接在线段树上进行的,所以复杂度是O(nlogn)。
当然这里是用分块做的,更暴力一些。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 1e5 + , maxN = ;
int B[maxN], Tag[maxN];
int a[maxn];
int n, m, N, L;
void Update(int i){
if(Tag[i] == -) return;
int bl = i*L, br = min(n, (i+)*L-);
for(int j = bl; j <= br; j++) a[j] = Tag[i];
Tag[i] = -;
}
void Change(int l, int r, int v){
for(int i = ; i < N; i++){
int bl = i*L, br = min(n, (i+)*L-);
if(l <= bl && br <= r){
Tag[i] = v;
B[i] = v;
} else if(bl <= l && l <= br && bl <= r && r <= br){
Update(i);
B[i] = max(B[i], v);
for(int j = l; j <= r; j++) a[j] = v;
} else if(bl <= l && l <= br){
Update(i);
B[i] = max(B[i], v);
for(int j = l; j <= br; j++) a[j] = v;
} else if(bl <= r && r <= br){
Update(i);
B[i] = max(B[i], v);
for(int j = bl; j <= r; j++) a[j] = v;
}
}
} int Findl(int x){
int bi = x/L;
int bl = bi*L, br = min(n, (bi+)*L-);
Update(bi);
for(int i = x-; i >= bl; i--){
if(a[i] > a[x]) return i;
}
for(int i = bi-; i >= ; i--){
if(B[i] > a[x]){
bl = i*L, br = min(n, (i+)*L-);
Update(i);
for(int j = br; j >= bl; j--)
if(a[j] > a[x]) return j;
}
}
return -;
} int Findr(int x){
int bi = x/L;
int bl = bi*L, br = min(n, (bi+)*L-);
Update(bi);
for(int i = x+; i <= br; i++){
if(a[i] > a[x]) return i;
}
for(int i = bi+; i < N; i++){
if(B[i] > a[x]){
bl = i*L, br = min(n, (i+)*L-);
Update(i);
for(int j = bl; j <= br; j++)
if(a[j] > a[x]) return j;
}
}
return -;
} int main()
{
int x, y, z;
cin>>n;
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
L = sqrt(n+0.5);
N = n/L + ;
for(int i = ; i < N; i++) Tag[i] = -;
for(int i = ; i <= n; i++){
B[i/L] = max(B[i/L], a[i]);
}
cin>>m;
for(int i = ; i <= m; i++){
scanf("%d", &x);
if(x == ){
scanf("%d %d %d", &x, &y, &z);
Change(x, y, z);
} else {
scanf("%d", &x);
int l = Findl(x), r = Findr(x);
if(l == - || r == -) printf("-1\n");
else printf("%d\n", r-l-);
}
}
}
计蒜客16492 building(二分线段树/分块)的更多相关文章
- 【原创】tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询)
最简单的线段树之一,中文题目,不翻译.... 注释讲的比较少,这已经是最简单的线段树,如果看不懂真的说明最基础的理论没明白 推荐一篇文章http://www.cnblogs.com/liwenchi/ ...
- [计蒜客T2238]礼物_线段树_归并排序_概率期望
礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...
- 计蒜客 28315.Excellent Engineers-线段树(单点更新、区间最值) (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E)
先写这几道题,比赛的时候有事就只签了个到. 题目传送门 E. Excellent Engineers 传送门 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到 ...
- 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛
Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...
- 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)
query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...
- 计蒜客 Prefix Free Code(字典树+树状数组)
Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...
- [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】
Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)
ACM训练联盟周赛 这一场有几个数据结构的题,但是自己太菜,不会树套树,带插入的区间第K小-替罪羊套函数式线段树, 先立个flag,BZOJ3065: 带插入区间K小值 计蒜客 Zeratul与Xor ...
随机推荐
- (第02节)集成Sping框架
通过第一节创建好的Web项目,接下来就是集成Spring框架 首先让我们看下创建好的Web项目的基本结构 其中,Java跟test是我自己创的,然后就是一般的webapp文件,和pom配置文件,要在w ...
- DevOps - 版本控制 - Git
配置 .gitignore 配置 .gitignore 配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为我们的版本管理带来很大的便利. 有些时候,你必须把某些文件放到Git工作目录中,但又 ...
- android SearchView和ListView简单使用
其实我写代码最担心遇到关于适配器的使用,在我的感觉中适配器是个难度很大的知识点,但是不能因为难而不去学习啊,毕竟现在时间很充裕,可以慢慢学,所以,不会也要写,真所谓,迎难而上啊. 下面是Search ...
- Windows下安装Mysql5.5.27(社区版)
所有平台的 MySQL 下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. 运行mysql-5.5.27-win32.msi 进入欢迎界面 ...
- C#中在WebClient中使用post发送数据实现方法
很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地.Intranet 或 Internet 资源发送数据以及从这些资源接收数据的公共方法 ...
- Node.js(一)----安装
1.下载 地址 https://nodejs.org/en/download/ 注: 系统为ubuntu 下载的源码包 tar.gz 或者 wget https://nodejs.org/dist/v ...
- Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000
启动程序报错: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006fff80000, 28636 ...
- hive自定义函数(UDF)
首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就 ...
- Java学习笔记十:Java的数组以及操作数组
Java的数组以及操作数组 一:什么是数组: 数组可以理解为是一个巨大的“盒子”,里面可以按顺序存放多个类型相同的数据,比如可以定义 int 型的数组 scores 存储 4 名学生的成绩 数组中的元 ...
- 二维数组快速排序(sort+qsort)
二维数组快速排序 qsort是c中快速排序,如果简单的一维数组排序,想必大家的懂.现在看一下二维数组的排序,虽然可以冒泡但是太费时间了,我们这里使用qsort来快速排序,看代码应该看得懂吧. 代码: ...