骚区间
题意:给一个长度为n的全排列,求有多少个骚区间。骚区间定义,对于[l,r]这个区间满足在这个区间中只有1个数小于al,只有1个数大于ar,那么这个区间就为骚区间。n<=1000000,ai数组为全排列。
思路:明显枚举每个端点作为骚区间的左端点,假设我们枚举ai作为左端点,然后在他右边找到第一个小于ai的数的位置x,然后再在x的右边找第一个小于ai的数的位置y,明显以ai为左端点的骚区间只能在[x,y)这个区间中选择右端点,同理也可以枚举每个数作为右端点,然后找他左边第一个第二个大于ai的数x,y,那么以这个数为右端点的骚区间的左端点只能在(x,y]中选择,这样的话问题就化成了枚举每个点作为左端点,然后得到一个区间,在log的时间复杂度的下,求这个区间中的每个数对应的区间中包含左端点的区间个数。
这个问题是这个题的最关键点,解决方法:对于每个端点x,他对应的右区间为[Rl,Rr),然后就可以枚举每个端点作为右端点,维护一个树状数组,在枚举到Rl的时候在x上加上1,然后在枚举到Rr时候在x上减去1,这样就可以保证在枚举到第i个端点时,可以把这个点当右端点的左端点的位置都在树状数组中体现出来,这样的话就可以解决这个问题了。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MAX_N=1010000;
int b[MAX_N],rk[MAX_N];
int Rl[MAX_N],Rr[MAX_N],Ll[MAX_N],Lr[MAX_N];
struct node{int l,r,minl,maxl,lazy;
}a[MAX_N*4];
void update(int k){//a[k].sum=a[k<<1].sum+a[k<<1|1].sum;a[k].minl=min(a[k<<1].minl,a[k<<1|1].minl);a[k].maxl=max(a[k<<1].maxl,a[k<<1|1].maxl);
}
void build(int k,int l,int r){a[k].l=l;a[k].r=r;a[k].lazy=0;if(l==r){a[k].minl=b[l];a[k].maxl=b[l];return;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);update(k);
}
int find1(int k,int x){if(a[k].l==a[k].r)return a[k].l;if(a[k<<1].minl<x)return find1(k<<1,x);elsereturn find1(k<<1|1,x);
}
int query1(int k,int l,int r,int x){if(a[k].l>=l&&a[k].r<=r){if(a[k].minl>=x)return -1;elsereturn find1(k,x);}int mid=(a[k].l+a[k].r)>>1;if(l<=mid){int y=query1(k<<1,l,r,x);if(y!=-1)return y;}if(r>mid){int y=query1(k<<1|1,l,r,x);if(y!=-1)return y;}
}
int find2(int k,int x){if(a[k].l==a[k].r)return a[k].l;if(a[k<<1|1].maxl>x)return find2(k<<1|1,x);elsereturn find2(k<<1,x);
}
int query2(int k,int l,int r,int x){if(a[k].l>=l&&a[k].r<=r){if(a[k].maxl<=x)return -1;elsereturn find2(k,x);}int mid=(a[k].l+a[k].r)>>1;if(r>mid){int y=query2(k<<1|1,l,r,x);if(y!=-1)return y;}if(l<=mid){int y=query2(k<<1,l,r,x);if(y!=-1)return y;}
}
int sum[MAX_N],n;
void add(int p,int x){while(p<=n){sum[p]+=x;p+=p&-p;}
}
int ask(int p){int res=0;while(p){res+=sum[p];p-=p&-p;}return res;
}
vector<int>ad[MAX_N],dl[MAX_N];
int main(void){int i,j;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&b[i]);rk[b[i]]=i;}b[0]=n+1;build(1,0,n+1);for(i=1;i<=n;i++){int x=query1(1,i+1,n+1,b[i]);if(x!=n+1){Rl[i]=x;Rr[i]=query1(1,x+1,n+1,b[i]);ad[Rl[i]].push_back(i);dl[Rr[i]].push_back(i);}x=query2(1,0,i-1,b[i]);if(x!=0){Lr[i]=x;Ll[i]=query2(1,0,x-1,b[i]);}}long long ans=0;for(i=1;i<=n;i++){for(j=0;j<ad[i].size();j++){int y=ad[i][j];add(y,1);}for(j=0;j<dl[i].size();j++){int y=dl[i][j];add(y,-1);}ans+=(long long)(ask(Lr[i])-ask(Ll[i]));}printf("%lld\n",ans);return 0;
}

牛客练习赛66 E-骚区间相关推荐

  1. 牛客练习赛25 B-最长区间

    题目链接: 题目描述 给你一个长度为 n 的序列 a ,求最长的连续的严格上升区间的长度. 同时会进行 m 次修改,给定 x , y ,表示将 ax 修改为 y ,每次修改之后都要求输出答案. 输入描 ...

  2. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  3. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  4. 妄想集合(牛客练习赛90)

    妄想集合(牛客练习赛90) 题意: 开始有 n 个可重集合,开始时每一个集合中都有一个数,有 m 个操作. Quant l r x\text{Quant l r x}Quant l r x:往编号在 ...

  5. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

  6. 牛客练习赛68 A.牛牛的mex

    牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1​,a2​,-,an​.现在牛牛有 qqq 次询 ...

  7. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  8. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

最新文章

  1. 50 多万个项目陷入混乱!只因代码库许可协议不兼容
  2. 第十七届智能车竞赛英飞凌专题培训 ——英飞凌无刷电机驱动专题
  3. spring mvc-使用Servlet原生API作为参数
  4. C#是面向对象编程语言
  5. 如何正确修补系统漏洞?
  6. 一种单独适配于NER的数据增强方法:DAGA
  7. 【Java】关于Java中的各种流
  8. Android闹钟设置的解决方案
  9. linux下查看用户个数和具体名字
  10. anaconda配置python_interpreter报错_MAC系统下SublimeText3 Python环境配置参考
  11. SIM900/SIM900A 模块实现收发短信,打电话
  12. 第十一届单片机蓝桥杯省赛(第一组)
  13. 苹果Mac中delete键的七种用法!
  14. 解决RecyclerView内子条目可滑动导致的滑动冲突
  15. 录制课件时,小米笔记本电脑,外接耳麦, 麦克风没那有声音,怎么办?
  16. 嵌入式linux 更新源,openwrt如何修改为国内软件源
  17. 自动部署 打造个人网站:阿里云(ECS)+域名+Node+Webhooks(github)
  18. java毕业设计物流站环境监测系统源码+lw文档+mybatis+系统+mysql数据库+调试
  19. 实战三十三:STAMP算法实现商品推荐实战 代码+数据
  20. 安卓集成Google Play支付(谷歌支付)最新版本

热门文章

  1. MT6735A和MT6753 前摄无法点亮
  2. python提取word目录_python批量提取word内信息
  3. Qt 给QWidget添加工具栏
  4. 海洋CMS火车头数据采集教程-自动配置采集发布模块教程
  5. 集列的上限集和下限集
  6. Fail2Ban 简介与使用
  7. 支付结算系统如何应对高并发、热点账户等问题
  8. 中兴通讯刀片服务器,中兴通讯发布行业首个OLT内置刀片技术白皮书
  9. 霍比特E姐有约|Exploit Network 如何打造 Web3.0 匿名支付协议
  10. 基于JavaWeb的新闻发布管理系统设计与实现