区间(interval)

题目描述

  zht有一个长度为n的排列P,现在zht想知道,有多少个由连续整数组成的区间[l,r][l,r]可以由PP中的两个区间[a,b],[c,d]拼出,其中1≤a≤b<c≤d≤n

  例如P=[1,5,2,4,6,3,那么数字区间[5,6][5,6]可以由PP的区间[2,2][2,2]与[5,5][5,5]拼出。换句话说PP中这两个区间数字的并集为[l,r]

输入

第一行一个整数nn表示排列中数字个数。
第二行nn个数表示排列。

输出

一行一个正整数表示答案。

样例输入

5
1 4 5 3 2

样例输出

10

提示

数据范围:

10%的数据:n≤20n≤20
40%的数据:n≤2000n≤2000
另有10%的数据:Pi=iPi=i
100%的数据: 1≤n≤3∗105


solution

考虑dp 令f[l][r]表示权值取l,r时会形成多少联通块。

我们枚举r,假设已经知道了f[1~r-1][r-1] 问题是如何快速求出f[1~r][r]

我们假设r在排列中的位置为x 找出p[x-1]和p[x+1]

然后分类讨论L的位置,决定转移是否要加1或减一

可以线段树优化。

现在还有个问题:怎么求f值为1和2的个数

我们可以存最小值,次小值和出现次数。

因为不会减到0,所以不用推来推去

好高级的线段树

注意不能写bj>0 要写bj!=0!!!!!

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 300005
#define ls k<<1
#define rs k<<1|1
#define inf 1e9
#define ll long long
using namespace std;
int n,a[maxn],p[maxn];
ll ans=0;
struct node{int l,r;ll ma,va,mb,vb,bj;void out(){cout<<"l: "<<l<<' '<<"r "<<r<<' '<<"a "<<ma<<' '<<va<<' '<<"b "<<mb<<' '<<vb<<' '<<endl;}
}tree[maxn*4];
struct no{ll m,v;
}s[4];
bool C(const no &a,const no &b){return a.m<b.m;
}
void wh(int k){s[0].m=tree[ls].ma,s[0].v=tree[ls].va;s[1].m=tree[ls].mb,s[1].v=tree[ls].vb;s[2].m=tree[rs].ma,s[2].v=tree[rs].va;s[3].m=tree[rs].mb,s[3].v=tree[rs].vb;sort(s,s+4,C);ll n1=s[0].m,v1=s[0].v,n2=0,v2=0;for(int i=1;i<4;i++){if(s[i].m==n1)v1+=s[i].v;else {if(!n2)n2=s[i].m,v2=s[i].v;else if(n2==s[i].m)v2+=s[i].v;}}tree[k].ma=n1,tree[k].va=v1;if(n1==inf)tree[k].mb=n1,tree[k].vb=0;else tree[k].mb=n2,tree[k].vb=v2;}
void build(int k,int L,int R){tree[k].l=L,tree[k].r=R;if(L==R){tree[k].ma=tree[k].mb=inf;return;}int mid=tree[k].l+tree[k].r>>1;build(k*2,L,mid);build(k*2+1,mid+1,R);wh(k);
}
void up(int k,int v){tree[k].ma+=v;tree[k].mb+=v;tree[k].bj+=v;
}
void down(int k){if(tree[k].bj!=0){up(k*2,tree[k].bj);up(k*2+1,tree[k].bj);tree[k].bj=0;}
}
void add(int k,int li,int ri,int v){if(li>ri)return;if(tree[k].l>=li&&tree[k].r<=ri){up(k,v);return;}down(k);int mid=tree[k].l+tree[k].r>>1;if(li<=mid)add(k*2,li,ri,v);if(ri>mid)add(k*2+1,li,ri,v);wh(k);
}
void ch(int k,int pl)
{if(tree[k].l==tree[k].r){tree[k].ma=1;tree[k].va=1;return;}down(k);int mid=tree[k].l+tree[k].r>>1;if(pl<=mid)ch(k*2,pl);else ch(k*2+1,pl);wh(k);
}
int main()
{cin>>n;for(int i=1;i<=n;i++){scanf("%d",&a[i]);p[a[i]]=i;}build(1,1,n);for(int i=1;i<=n;i++){int x=p[i];int l=a[x-1],r=a[x+1];if(l>r)swap(l,r);if(l>=i)add(1,1,i-1,1);if(r>=i&&l<i)add(1,l+1,i-1,1);if(r<i){add(1,1,l,-1);add(1,r+1,i-1,1);}if(tree[1].ma<3)ans+=tree[1].va;if(tree[1].mb<3)ans+=tree[1].vb;ch(1,i);}cout<<ans<<endl;return 0;
}
/*
5
1 4 2 5 3
*/

区间(interval)相关推荐

  1. 牛客小白月赛5 I.区间 (interval)

    牛客小白月赛5 I.区间 (interval) 题目链接 题目描述 Apojacsleam喜欢数组.他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:操作一:将a[L]-a[R]内 ...

  2. java判断一个数值是否在数学区间范围内

    使用方法: 直接调用IntervalUtil.isInTheInterval(String data_value,String interval) 工具类 IntervalUtil package c ...

  3. 一维树桩数组区间更新、区间查询

    链接:https://www.nowcoder.com/acm/contest/135/I 来源:牛客网 区间 (interval) 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 3 ...

  4. java判断某个数值是否在一个数值区间内

    区间判断工具类的编写 说明 重点:区间工具类(转载:前行123的博客) 使用 说明 开发中,有这么一个需求,需要根据某些属性值来进行等级判断,并把判断好的结果持久化到数据库中.而这些等级区间的格式是这 ...

  5. 【VS开发】【智能语音处理】Windows下麦克风语音采集

    简介 这是我很早以前的大学毕业设计,忽然间找到贴出来以纪念自己的纯真年代...但是因为CSDN不给面子所以导致短短的一篇文章贴了足足7次..他老提时说文章超过了64K,老大,拜托,那是算上了里面的图片 ...

  6. 拜托,别再问我贪心算法了!

    来自:码海 前言 上篇一文学会动态规划解题技巧 被不少号转载了,其中发现有一位读者提了一个疑惑,在求三角形最短路径和时,能否用贪心算法求解.所以本文打算对贪心算法进行简单地介绍,介绍完之后我们再来看看 ...

  7. Linux对用户态的动态内存管理

    Linux对内核态内存分配请求与用户态内存分配请求处理上分别对待 Linux本身信任自己,因此Linux内核请求分配多少内存,就会马上分配相同数量的内存出来. 但内核本身不相信应用程序,而且通常应用程 ...

  8. vb mschart 坐标名称_最强干货来了:Grasshopper运算器名称总结(上篇)

    Grasshopper是一款在Rhino环境下运行的采用程序算法生成模型的插件.不同于Rhino Script,Grasshopper不需要太多任何的程序语言的知识就可以通过一些简单的流程方法达要的模 ...

  9. 面试官: Flink双流JOIN了解吗? 简单说说其实现原理

    摘要:今天和大家聊聊Flink双流Join问题.这是一个高频面试点,也是工作中常遇到的一种真实场景. 本文分享自华为云社区<万字直通面试:Flink双流JOIN>,作者:大数据兵工厂 . ...

  10. mysql数据库年龄_sql获取时间、年龄

    mysql数据库获取年龄:TIMESTAMPDIFF(YEAR, [出生日期字段], CURDATE()) select * from (select name 姓名,TIMESTAMPDIFF(YE ...

最新文章

  1. 特征工程(二) :文本数据的展开、过滤和分块
  2. STATISTICS TIME ON
  3. html:(29):伪选择符和分组选择符
  4. 理科状元4年博士0篇论文,发顶刊终逆袭
  5. 【转载】要有梦想-创造卓越的职业生涯
  6. 高清晰桌面壁纸,视觉控不用到处找尽在高图网
  7. 空字符python_Python中的None与 NULL(即空字符)的区别详解
  8. 剑指 Offer 55 - I. 二叉树的深度
  9. linux微软雅黑字体库_Debian系统中安装微软雅黑字体的教程
  10. Overloud TH3 for Mac(电吉他效果器)
  11. 微信小程序 支付宝小程序 实现省市区县四级联动
  12. 导出Excel支持锁定表头
  13. 何小鹏快跑:身家暴涨50亿美元,他还愿坐经济舱吗?
  14. 关于时钟晶振  速率  倍频
  15. VMware虚拟机全屏状态下如何快速切换回原主机界面
  16. 城头土命适合做计算机电脑职业,土命人适合的职业
  17. OCLint + Infer + Jenkins + SonarQube 搭建iOS代码静态分析系统
  18. HBase BulkLoad批量写入数据实战
  19. 青龙2.11.3版本对接傻妞+go-cqhttp+短信登录(Maiark)(兔子)+本地服务器直连GitHub
  20. iOS年月日、时分秒选择器

热门文章

  1. LaTeX公式保姆级教程
  2. 对于Adobe平面设计证书,高级平面设计师,有话说!
  3. 如何写一个高效的串口接收程序
  4. 标梵讲解域名注册的流程和注意事项!
  5. 玩转Win7媒体中心 轻松看网络电视
  6. 【论文阅读】 VL-BERT: Pre-training of generic visual-linguistic representations
  7. 瑞芯微RK3399Pro平台YOLOv4 pytorch模型转RKNN模型失败
  8. POJ-2438 哈密顿环 哈密瓜很甜
  9. thymeleaf模板引擎如何共享头部和底部公共资源
  10. scm中mysql作用_SCM系统的作用有哪些