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');
}

考虑30分的可以拿个单调栈向左扫一遍向右扫一遍再将个数加起来再减去1即可。

这道题是要求我们判断这个景点的评估值在给定的子区间里是否有比它大值存在,如果一边没有大于它的存在,则它就是旅客会前往的景点。

既需要位置关系又需要大小关系,我们考虑大根笛卡尔树。

笛卡尔树是一种同时满足二叉搜索树和堆的性质的数据结构。

它的中序遍历的序列为原数组序列。

树中节点的值大于其左右子节点的值。

建树很简单, 用个单调栈O(n)即可建好。我们很容易发现一些性质:

1.对于一个询问L,R它的答案只会出现在笛卡尔树的路径上。

2.L,R的LCA中,从L到LCA路径上,有一个点是其父亲的左孩子答案就加一,R到LCA上,有一个点是其父亲的右孩子答案就加一。

我们知道笛卡尔树上一个点A是其父亲B的左孩子表明A在它父亲B的左边,且权值小于父亲B,对于LLCA路径(也就是区间L-LCA)中而言这意味着A的左边没有比它大的点(如果有,那么A应该会在比它大的那个点C的右边),于是就对答案有1的贡献,虽然右边有比它大的点(父亲B);对于RLCA路径(也就是区间LCA-R)中则相反。这就很好的符合题目的性质,我们就可以用笛卡尔树解决这道题了。

我们就可以用tarjan求出LCA,然后预处理下每个点到根节点的路径上有多少个点是其父亲的左孩子和右孩子,然后计算出答案即可。时间复杂度 O(NαN)

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N 3000002
using namespace std;
int n,m,t,zhan[N],len,num,ans[N],f[N],u,v,head[N],root,visit[N];
struct data1{
int l,r,p,v,lnum,rnum;
void init(){
l=,r=,p=,v=,lnum=,rnum=;
}
}tree[N];
struct data2{
int next,to,sign;
}line[N];
int read()
{
int x=,sig=;
char c;
for (c=getchar();c<'' || c>'';c=getchar()) if (c=='-') sig=-;
for (;c>='' && c<='';c=getchar()) x=x*+c-;
return x*sig;
}
void write(int x)
{
if (!x) putchar('');else
{
char s[];
int i,j=;
for (;x>;x/=) s[j++]=x%;
for (i=j-;i>=;i--) putchar(s[i]+);
}
putchar('\n');
}
void add(int u,int v){
num++;
line[num].next=head[u];
line[num].to=v;
line[num].sign=num;
head[u]=num;
num++;
line[num].next=head[v];
line[num].to=u;
line[num].sign=num;
head[v]=num;
}
int build(){ //建笛卡尔树
len=;
zhan[]=;
for (int i=;i<=n;i++){
while ((len>)&&(tree[zhan[len]].v<tree[i].v)) len--;
if (len){
tree[i].p=zhan[len];
tree[tree[zhan[len]].r].p=i;
tree[i].l=tree[zhan[len]].r;
tree[zhan[len]].r=i;
}
else {
tree[zhan[]].p=i;
tree[i].l=zhan[];
}
zhan[++len]=i;
}
return zhan[];
}
int find(int x){
if (f[x]==x) return x;
f[x]=find(f[x]);
return f[x];
}
void tarjan(int x,int ln,int rn){ //Tarjan求LCA
f[x]=x;
visit[x]=;
tree[x].lnum=ln;
tree[x].rnum=rn;
if (tree[x].l) {
tarjan(tree[x].l,ln+,rn);
f[tree[x].l]=x;
}
if (tree[x].r) {
tarjan(tree[x].r,ln,rn+);
f[tree[x].r]=x;
}
int v=,e=;
for (int i=head[x];i!=;i=line[i].next){
v=line[i].to;
if (visit[v]){e=find(v);
if (line[i].sign&) ans[(line[i].sign+)/]=tree[x].lnum-tree[e].lnum+tree[v].rnum-tree[e].rnum+;
else ans[line[i].sign/]=tree[v].lnum-tree[e].lnum+tree[x].rnum-tree[e].rnum+;
}
}
}
int main(){
freopen("trip.in","r",stdin);
freopen("trip.out","w",stdout);
memset(visit,,sizeof(visit));
n=read();
m=read();
for (int i=;i<=n;i++){
tree[i].init();
tree[i].v=read();
}
root=build();
num=;
for (int i=;i<=m;i++){
u=read();
v=read();
add(u,v);
}
tarjan(root,,);
for (int i=;i<=m;i++)
write(ans[i]);
return ;
}

神奇的代码

联想很重要

JZOJ.5246【NOIP2017模拟8.8】Trip的更多相关文章

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

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

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

    5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...

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

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

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

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

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

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

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

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

  7. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  8. JZOJ.5281【NOIP2017模拟8.15】钦点

    Description

  9. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

随机推荐

  1. 中国版Azure支持那些版本号Linux

    不在下述列表中的Linux表示尚未经过正式验证,并不意味着不能使用,客户能够通过自行上传镜像文件的方式使用其它Linux版本号,可是不保证是否遇到一些驱动或者兼容问题. 分发 版本号 上次验证时间 驱 ...

  2. Call to undefined function mysql_connect()

    Fatal error: Call to undefined function mysql_connect() in /data/www/qy_b2b/include/db_mysql.class.p ...

  3. kettle--组件(3)--行转列

    组件图如下: 以上操作可以这么理解: IF(DATA1=DATA4) THEN DATA2=DATA3 也就是关键字值的数值会与关键字段的数值匹配,匹配上了就显示数据value filedname所填 ...

  4. js错误处理和调试

    1.重点关注函数和可能导致函数执行失败的因素. 2.抛出错误和使用try-catch的时机:一般来说在应用程序架构较低的层次中经常会抛出错误.这个层次并不会影响当前执行的代码. 错误也得不到真正的处理 ...

  5. html5-表单常见操作

    <form  autocompelate="on" id="from1"><!--常用属性-->邮件:<input type=&q ...

  6. IOS 颜色 16进制 转换

    #define RGB(r,g,b) ([UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]) #define HEXTO ...

  7. 李洪强和你一起学习前端之(4)HTML5介绍

    1.1认识HTML5 html的版本: html4 Xhtml1.0 目前: html5是最高的版本 再怎么变化,无非是多了一些标签而已,但是不单单是提供了一些标签 比如: 开发网页游戏 我们可以开发 ...

  8. What is Web Application Architecture? How It Works, Trends, Best Practices and More

    At Stackify, we understand the amount of effort that goes into creating great applications. That’s w ...

  9. JS对象序列化为JSON对象的方法

    var $ = $ || {}; /** * 将JS对象序列化为JSON字符串 * @param {Mixed} o The variable to decode * @return {String} ...

  10. 线程同步工具CountDownLatch

    CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行.假如我们这个想要继续往下执行的任务调用一个CountDownLatc ...