BZOJ 4491: 我也不知道题目名字是什么 线段树+离线
code:
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define N 50003
#define lson now<<1
#define rson now<<1|1
#define inf 100000000
using namespace std;
void setIO(string s) {
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
int n;
int sm[N];
int bg[N];
int pos[N];
int val[N];
int mx[N<<2];
int mn[N<<2];
int answer[N];
struct node {
int x;
int id;
node(int x=0,int id=0):x(x),id(id){}
}a[N<<1];
struct data {
int l,r,id;
data(int l=0,int r=0,int id=0):l(l),r(r),id(id){}
}e[N];
bool cmp(node a,node b) {
return a.x==b.x?a.id<b.id:a.x<b.x;
}
bool cmp_data(data a,data b) {
return a.r<b.r;
}
void build(int l,int r,int now) {
if(l==r) {
mn[now]=inf;
mx[now]=-inf;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
}
void fix_mn(int l,int r,int now,int p,int v) {
if(l==r) {
mn[now]=v;
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
fix_mn(l,mid,lson,p,v);
}
else {
fix_mn(mid+1,r,rson,p,v);
}
mn[now]=min(mn[lson],mn[rson]);
}
void fix_mx(int l,int r,int now,int p,int v) {
if(l==r) {
mx[now]=v;
return;
}
int mid=(l+r)>>1;
if(p<=mid) {
fix_mx(l,mid,lson,p,v);
}
else {
fix_mx(mid+1,r,rson,p,v);
}
mx[now]=max(mx[lson],mx[rson]);
}
int que_mn(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) {
return mn[now];
}
int mid=(l+r)>>1,re=inf;
if(L<=mid) {
re=min(re,que_mn(l,mid,lson,L,R));
}
if(R>mid) {
re=min(re,que_mn(mid+1,r,rson,L,R));
}
return re;
}
int que_mx(int l,int r,int now,int L,int R) {
if(l>=L&&r<=R) {
return mx[now];
}
int mid=(l+r)>>1,re=-inf;
if(L<=mid) {
re=max(re,que_mx(l,mid,lson,L,R));
}
if(R>mid) {
re=max(re,que_mx(mid+1,r,rson,L,R));
}
return re;
}
int main() {
// setIO("input");
int i,j,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;++i) {
scanf("%d",&val[i]);
}
pos[n]=sm[n]=bg[n]=n;
for(i=n-1;i>=1;--i) {
sm[i]=(val[i+1]<=val[i]?sm[i+1]:i);
bg[i]=(val[i+1]>=val[i]?bg[i+1]:i);
pos[i]=max(sm[i],bg[i]);
a[++cnt]=node(i,0);
a[++cnt]=node(pos[i],i);
}
sort(a+1,a+1+cnt,cmp);
int q;
scanf("%d",&q);
for(i=1;i<=q;++i) {
scanf("%d%d",&e[i].l,&e[i].r);
e[i].id=i;
}
sort(e+1,e+1+q,cmp_data);
build(1,n,1);
for(i=j=1;i<=q;++i) {
while(j<=cnt&&a[j].x<=e[i].r) {
if(a[j].id) {
fix_mn(1,n,1,a[j].id,inf);
fix_mx(1,n,1,a[j].id,a[j].x-a[j].id+1);
}
else {
fix_mn(1,n,1,a[j].x,a[j].x);
}
++j;
}
answer[e[i].id]=max(e[i].r-que_mn(1,n,1,e[i].l,e[i].r)+1, que_mx(1,n,1,e[i].l,e[i].r));
}
for(i=1;i<=q;++i) {
printf("%d\n",answer[i]);
}
return 0;
}
BZOJ 4491: 我也不知道题目名字是什么 线段树+离线的更多相关文章
- BZOJ 4491: 我也不知道题目名字是什么
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 278 Solved: 154[Submit][Status][ ...
- BZOJ 4491: 我也不知道题目名字是什么 RMQ
4491: 我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 317 Solved: 174[Submit][Status][ ...
- 【BZOJ4491】我也不知道题目名字是什么 [线段树]
我也不知道题目名字是什么 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 给定一个序列A[i ...
- 【BZOJ4991】我也不知道题目名字是什么(线段树)
[BZOJ4991]我也不知道题目名字是什么(线段树) 题面 BZOJ 题解 对于线段树维护的区间维护以下东西: 区间左(右)端开始(结束)的最长(短)子串的长度 左端右端的值,以及当前区间内的答案 ...
- bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并)
bzoj5417/luoguP4770 [NOI2018]你的名字(后缀自动机+线段树合并) bzoj Luogu 给出一个字符串 $ S $ 及 $ q $ 次询问,每次询问一个字符串 $ T $ ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- BZOJ.5417.[NOI2018]你的名字(后缀自动机 线段树合并)
LOJ 洛谷 BZOJ 考虑\(l=1,r=|S|\)的情况: 对\(S\)串建SAM,\(T\)在上面匹配,可以得到每个位置\(i\)的后缀的最长匹配长度\(mx[i]\). 因为要去重,对\(T\ ...
- [NOI2018]你的名字(后缀自动机+线段树)
题目描述 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的,ION 命题手 ...
- BZOJ5417[Noi2018]你的名字——后缀自动机+线段树合并
题目链接: [Noi2018]你的名字 题目大意:给出一个字符串$S$及$q$次询问,每次询问一个字符串$T$有多少本质不同的子串不是$S[l,r]$的子串($S[l,r]$表示$S$串的第$l$个字 ...
随机推荐
- 一、SqlServer查询今天的数据-多写法对比性能问题
-- 目标:查询当天的所有数据 -- 说明:表数据行数:960w --方法一:使用格式化被查询条件与格式化当前时间比对 ),)),) --方法二:使用函数DATEDIFF 比对 --方法三:使用传统比 ...
- 【转】在cmd/bat脚本中获取当前脚本文件所在目录
一.关于cd的/d参数 关于cd 的/d参数,在cmd中敲入cd /?可以看到/d参数的解释如下: 使用 /D 命令行开关,除了改变驱动器的当前目录之外,还可改变当前驱动器.这句话不太好理解,我做个试 ...
- 1+x 证书 Web 前端开发 CSS3 专项练习
官方QQ群 1+x 证书 Web 前端开发 CSS3 专项练习 http://blog.zh66.club/index.php/archives/196/
- D3力布图绘制--基本方法
本文主要结合案例记录使用D3.js绘制力布图的基本方法 样例显示 基本配置 this.force = d3.layout .force() .size([this.width, this.height ...
- ng 判定输入的手机号是否正确
判定输入的手机号是否正确 infoConfirm(){ if (!/^1[3456789]\d{9}$/.test(this.mobile)) { this.pho ...
- logical函数
logical函数(逻辑函数) logical(x):x ~=0时,logical(x)=1:x = 0时,logical(x)=0
- Ubuntu Err:1 http://us.archive.ubuntu.com/ubuntu bionic InRelease Could not resolve 'us.archive.ubuntu.com' 错误
Ubuntu 更新 apt-get update 的时候 出现 Err: http://us.archive.ubuntu.com/ubuntu bionic InRelease Could not ...
- winform子窗口调用父窗口的控件及方法-一般调用
首先新建一个窗体应用程序,在项目属性中点击右键->添加->添加新项,选择Windows窗体->添加. 在Form1和Form2窗口中各添加一个按钮,并双击添加事件处理函数: ...
- 【微信原生支付】服务商模式-小微商户专属接口:小微商户新增对应APPID关联API
文档地址:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=20_3&index=3 这个接口比较特殊不需要nonce_st ...
- Vs2017发布可在线更新的Winform程序
如题,此处引用“南秦岭”的博文<使用ClickOnce发布Windows应用程序>,对作者表示感谢! 补充说明: “发布文件夹”是指你电脑上的本地文件夹:“安装文件夹”是指你提供给用户的u ...