5246. 【NOIP2017模拟8.8A组】Trip(trip)

(File IO): input:trip.in output:trip.out

Time Limits: 1500 ms Memory Limits: 262144 KB Detailed Limits

Description

多年之后,worldwideD厌倦竞争,隐居山林。

他的家乡开始发展起了旅游业,在一条很长的主干道上,有N个旅游景点,按顺序编号为1到N。根据游客们网上的评分,第i个景点有一个评估值a[i],为了区分开不同的景点,评估值是两两不同的。

今天有M组游客前来旅游,第i组游客选择遍历景点Li到景点Ri这一段路。他们搜到Li到Ri的所有评估值,如果对于景点j(Li≤j≤Ri),不存在景点x(Li≤x<j)满足a[x]>a[j]或不存在景点y(j<y≤Ri)满足a[y]>a[j],那么他们会进入景点j。

现在worldwideD想知道,每组游客会去多少个景点。

Input

第一行两个整数N,M,意义见题面。

接下来一行N个整数,第i个是a[i],意义见题面。

接下来M行,第i行两个整数Li,Ri,意义见题目。

Output

M行,第i行表示第i组游客去的景点个数。

Sample Input

6 4

3 1 7 4 5 2

1 5

2 5

2 6

4 6

Sample Output

3

3

4

3

Data Constraint

30%:N,M≤5,000

60%:N,M≤100,000

100%:N,M≤1,000,000 0≤|a[i]|≤1,000,000,000 1≤Li≤Ri≤N

Hint

第一组游客选择路段的景点评估值序列为[3,1,7,4,5],其中3,7,5满足条件

第二组游客选择路段的景点评估值序列为[1,7,4,5],其中1,7,5满足条件

第三组游客选择路段的景点评估值序列为[1,7,4,5,2],其中3,7,5,2满足条件

第四组游客选择路段的景点评估值序列为[4,5,2],其中4,5,2满足条件

本题数据规模较大,请注意您的常数造成的影响。

在这里给出一种输入输出优化的模板,在主程序中直接调用read()即可读入一个整数,调用write(x)可以把一个int变量x输出并换行。

int read()
{
int x=0,sig=1;
char c;
for (c=getchar();c<'0' || c>'9';c=getchar()) if (c=='-') sig=-1;
for (;c>='0' && c<='9';c=getchar()) x=x*10+c-48;
return x*sig;
}
void write(int x)
{
if (!x) putchar('0');else
{
char s[10];
int i,j=0;
for (;x>0;x/=10) s[j++]=x%10;
for (i=j-1;i>=0;i--) putchar(s[i]+48);
}
putchar('\n');
}

题解

对于每个区间,找出最大值,然后从两端到最大值分别建两个单调栈,两个栈个数之和-1就是答案

但很显然这样只有30分

怎么优化呢?

给原序列建一颗笛卡尔树,这个用单调栈O(N)搞定

笛卡尔树满足堆和二叉搜索树(二叉排序树)的性质

即它的中序遍历是原序列,同时跟比左右儿子大(小)

于是,我们发现

1. 答案只可能出现在L和R在笛卡尔树上的路径上

2. 在L到lca(L,R)的路径上,只有自己是父亲节点的左儿子的节点,才对答案贡献1,R到lca(L,R)就反过来

那么就用Tarjan求lca,并预处理出每个点到根节点有多少个点是父亲的左/右节点

代码

#pragma GCC optimize (2)
#include<cstdio>
#include<vector>
#define N 1000010
using namespace std; struct node{
long key,lc,rc,fa;
}a[N];
long sta[N],l[N],r[N],top,ll,rr; void push(long q)
{
sta[++top]=q;
}
void pop()
{
top--;
}
long front()
{
return sta[top];
} long father[N];
long cha(long now)
{
return (father[now]==now)?now:father[now]=cha(father[now]);
}
void bin(long a,long b)
{
father[cha(b)]=cha(a);
} long ans[N],x[N],y[N];
bool b[N];
vector<long>ask[N];
void tarjan1(long now)
{ long i;
bool t=false;
for(i=a[now].lc;i&&!b[i];i=a[i].lc){
push(i);
l[i]=l[a[i].fa]+1;
r[i]=r[a[i].fa];
t=true;
}
if(t)return;
b[now]=true;
if(a[now].rc){
l[a[now].rc]=l[now];
r[a[now].rc]=r[now]+1;
push(a[now].rc);
return;
}
}
void tarjan2(long now)
{ long q,w;
vector<long>::iterator i;
for(i=ask[now].begin();i!=ask[now].end();++i){
q=*i;
if(now==x[q])w=y[q];
else w=x[q];
if(!ans[q]&&b[w])
ans[q]=cha(w);
}
bin(a[now].fa,now);
}
void tarjan(long now)
{
push(now);
l[now]=r[now]=0;
while(top){
if(!b[front()])
tarjan1(front());
else{
tarjan2(front());
pop();
}
}
} int read()
{
int x=0,sig=1;
char c;
for (c=getchar();c<'0' || c>'9';c=getchar()) if (c=='-') sig=-1;
for (;c>='0' && c<='9';c=getchar()) x=x*10+c-48;
return x*sig;
}
void write(int x)
{
if (!x) putchar('0');else
{
char s[10];
int i,j=0;
for (;x>0;x/=10) s[j++]=x%10;
for (i=j-1;i>=0;i--) putchar(s[i]+48);
}
putchar('\n');
} int main()
{ long n,m,i,maxx=-2147483647,pos;
freopen("trip.in","r",stdin);
freopen("trip.out","w",stdout);
n=read();
m=read();
for(i=1;i<=n;i++){
a[i].key=read();
father[i]=i;
if(a[i].key>maxx){
maxx=a[i].key;
pos=i;
}
while(top&&a[sta[top]].key<a[i].key){
a[i].lc=front();
pop();
}
a[a[i].lc].fa=i;
if(top){
a[i].fa=front();
a[front()].rc=i;
}
push(i);
}
for(i=1;i<=m;i++){
x[i]=read();
y[i]=read();
ask[x[i]].push_back(i);
ask[y[i]].push_back(i);
}
top=0;
tarjan(pos);
for(i=1;i<=m;i++)
write(l[x[i]]-l[ans[i]]+r[y[i]]-r[ans[i]]+1);
return 0;
}

JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)的更多相关文章

  1. [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)

    题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...

  2. JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列

    5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...

  3. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...

  4. JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠

    JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...

  5. JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计

    5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...

  6. JZOJ 4273. 【NOIP2015模拟10.28B组】圣章-精灵使的魔法语

    4273. [NOIP2015模拟10.28B组]圣章-精灵使的魔法语 (File IO): input:elf.in output:elf.out Time Limits: 1000 ms  Mem ...

  7. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...

  8. JZOJ 3508. 【NOIP2013模拟11.5B组】好元素

    3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms  Mem ...

  9. JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密

    272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms  M ...

随机推荐

  1. 吴裕雄--天生自然python机器学习:机器学习简介

    除却一些无关紧要的情况,人们很难直接从原始数据本身获得所需信息.例如 ,对于垃圾邮 件的检测,侦测一个单词是否存在并没有太大的作用,然而当某几个特定单词同时出现时,再辅 以考察邮件长度及其他因素,人们 ...

  2. SpringBoot项目后台对接微信支付开发——微信统一下单接口开发

    开始没找到微信支付的sdk.自己根据官方给的接口文档纯手写,各种xml转JSON,JSON转xml,加密解密,签名....整个人都是崩溃的 开发的第三天,发现有官方的sdk.心情一下子豁然开朗,整个人 ...

  3. android愤怒小鸟游戏、自定义View、掌上餐厅App、OpenGL自定义气泡、抖音电影滤镜效果等源码

    Android精选源码 精练的范围选择器,范围和单位可以自定义 自定义View做的小鸟游戏 android popwindow选择商品规格颜色尺寸效果源码 实现Android带有锯齿背景的优惠样式源码 ...

  4. KVC解析

    •  阅读  valueForKey (总体规划,先找相关方法,再找相关变量) 1.先是找相关方法,如果方法找不到 2.那么去判断 1 2 3 + (BOOL)accessInstanceVariab ...

  5. SQL数据库的查询方法

    简单查询: 一.投影 select * from 表名 select 列1,列2... from 表名 select distinct 列名 from 表名 二.筛选 select top 数字 列| ...

  6. Array.prototype.slice.call()方法的理解

    1.基础1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 指倒数第二 ...

  7. springboot学习笔记:1.前言

    眼下,随着微服务敏捷开发的势头日益增长,前几年刚刚萌芽的话题,到了现在已经炽手可热.在java圈子里,springboot作为spring生态圈的顶级项目,更是火的不得了.作为java程序员,不了解和 ...

  8. LINQ之路 7:子查询、创建策略和数据转换(要点笔记)

    匿名类型 上面我们自己定义了类型TempProjectionItem来存放查询的结果.通过使用匿名类型,我们可以省去这种中间类型的定义,而由编译器来帮我们完成: select item.Origina ...

  9. Nginx笔记总结二十:nginx索引目录配置

    location / { autoindex on; autoindex_localtime on; }

  10. dubbo分布式框架下web层调用业务层一直报空指针异常的解决办法

    java.lang.NullPointerException............... 环境:SSM(通用mapper)+Dubbo 1.检查导包 提示注解@Reference  应该导入  im ...