题目大意:给你一个排列,多次询问,每次给你一个区间,问有多少子区间,数字取出来sort一遍是连续的一段。
题解:
考虑l=1,r=n咋做。
考虑一段合法,当且仅当max-min=r-l。
那么用个单调栈预处理每个数字在哪些[l,r]会成为最大/最小值,然后扫描线维护max-min+l的最小值,显然由于[r,r]是答案所以能取到最小值的位置都一定是答案。
考虑整个问题,就是每次在所有最小值的位置+1,区间求和。
这个可以类似segment tree beats的在下传标记的时候根据当前区间和儿子区间的最小值的打小关系讨论一下即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
namespace INPUT_SPACE{const int BS=(1<<24)+5;char Buffer[BS],*HD,*TL;char gc() { if(HD==TL) TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);return (HD==TL)?EOF:*HD++; }inline int inn(){int x,ch;while((ch=gc())<'0'||ch>'9');x=ch^'0';while((ch=gc())>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;}
}using INPUT_SPACE::inn;
namespace OUTPUT_SPACE{char ss[10000000],tt[30];int ssl,ttl;inline int print(lint x){if(!x) ss[++ssl]='0';for(ttl=0;x;x/=10) tt[++ttl]=char(x%10+'0');for(;ttl;ttl--) ss[++ssl]=tt[ttl];return ss[++ssl]='\n';}inline int Flush() { return fwrite(ss+1,sizeof(char),ssl,stdout),ssl=0,0; }
}using OUTPUT_SPACE::print;using OUTPUT_SPACE::Flush;
const int N=130000,Q=N;
int L[N],R[N],s[N],p[N];
vector<pair<pii,int> > v[N];
vector<pii> q[N];lint ans[Q];
inline int getLR(int n,int t=0)
{for(int i=1;i<=n;s[++t]=i++)while(t&&p[s[t]]<p[i]) R[s[t--]]=i-1;while(t) R[s[t--]]=n;for(int i=n;i>=1;s[++t]=i--)while(t&&p[s[t]]<p[i]) L[s[t--]]=i+1;while(t) L[s[t--]]=1;rep(i,1,n) v[i].pb(mp(mp(L[i],i),p[i])),v[R[i]+1].pb(mp(mp(L[i],i),-p[i]));return 0;
}
struct segment{int l,r,mn,cnt,mnpt,anspt;lint ans;segment *ch[2];
}*rt;
inline int push_up(segment* &rt)
{segment *&lc=rt->ch[0],*&rc=rt->ch[1];rt->mn=min(lc->mn,rc->mn);if(lc->mn==rc->mn) rt->cnt=lc->cnt+rc->cnt;else if(lc->mn<rc->mn) rt->cnt=lc->cnt;else rt->cnt=rc->cnt;return rt->ans=lc->ans+rc->ans,0;
}
int build(segment* &rt,int l,int r)
{rt=new segment,rt->l=l,rt->r=r;rt->ans=rt->anspt=rt->mnpt=0,rt->cnt=1;int mid=(l+r)>>1;if(l==r) return rt->mn=l;build(rt->ch[0],l,mid),build(rt->ch[1],mid+1,r);return push_up(rt);
}
inline int update_mn(segment* &rt,int v) { return rt->mn+=v,rt->mnpt+=v,0; }
inline int update_ans(segment* &rt,int v) { return rt->ans+=(lint)v*rt->cnt,rt->anspt+=v,0; }
inline int push_down(segment* &rt)
{if(rt->mnpt) update_mn(rt->ch[0],rt->mnpt),update_mn(rt->ch[1],rt->mnpt),rt->mnpt=0;if(rt->anspt)(rt->ch[0]->mn==rt->mn?update_ans(rt->ch[0],rt->anspt):0),(rt->ch[1]->mn==rt->mn?update_ans(rt->ch[1],rt->anspt):0),rt->anspt=0;return 0;
}
int update(segment* &rt,int s,int t,int v)
{int l=rt->l,r=rt->r,mid=(l+r)>>1;if(s<=l&&r<=t) return update_mn(rt,v);if(rt->mnpt||rt->anspt) push_down(rt);if(s<=mid) update(rt->ch[0],s,t,v);if(mid<t) update(rt->ch[1],s,t,v);return push_up(rt);
}
lint query(segment* &rt,int s,int t)
{int l=rt->l,r=rt->r,mid=(l+r)>>1;if(s<=l&&r<=t) return rt->ans;lint ans=0;if(rt->mnpt||rt->anspt) push_down(rt);if(s<=mid) ans+=query(rt->ch[0],s,t);if(mid<t) ans+=query(rt->ch[1],s,t);return ans;
}
int main()
{int n=inn();rep(i,1,n) p[i]=inn();int qc=inn(),l;rep(i,1,qc) l=inn(),q[inn()].pb(mp(l,i));getLR(n);rep(i,1,n) p[i]=-p[i];getLR(n);build(rt,1,n);rep(r,1,n){Rep(i,v[r]) update(rt,v[r][i].fir.fir,v[r][i].fir.sec,v[r][i].sec);update_ans(rt,1);Rep(i,q[r]) ans[q[r][i].sec]=query(rt,q[r][i].fir,r);}rep(i,1,qc) print(ans[i]);return Flush(),0;
}

青春野狼不做姐控偶像的梦 - 线段树 - 扫描线 - 单调栈相关推荐

  1. 【XSY3367】青春野狼不做姐控偶像的梦(线段树)

    题意:给一个 1∼n1\sim n1∼n 的排列,多次询问某段区间内的值域连续子区间的个数. 区间值域连续的另一种表达方式:max−min=r−lmax-min=r-lmax−min=r−l,即 (m ...

  2. 【做练习】K-th Number(线段树)线段树的原理

    1. 题目 描述 You are working for Macrohard company in data structures department. After failing your pre ...

  3. 青春野狼不做小恶魔学妹的梦 - 斯特林数 - 多项式理论

    题目大意: 对所nnn个点的连通图G\mathrm{G}G求边数的kkk次方和. n≤5×104,k≤15n\le5\times10^4,k\le15n≤5×104,k≤15 题解: 显然考虑斯特林数 ...

  4. 青春野狼不做理性小魔女的梦 - 莫比乌斯反演 - 拉格朗日插值 - 杜教筛

    题目大意: 给定 { A k } \{A_k\} {Ak​}(有些位置是-1表示一会要由你决定). 对每个 m ∈ [ 1 , n ] m\in[1,n] m∈[1,n],求有多少方案(将 − 1 - ...

  5. 【做题记录】区间排序—线段树

    1. CF558E A Simple Task 题意: 给定由小写字母组成的字符串 \(s\) 每一次操作如下: \(opt=0\) :将 \([l,r]\) 降序排序 \(opt=1\) :将 \( ...

  6. ATL和ActiveX做的控件.dll和.ocx最主要的区别(摘录)

    楼主是不是说用ATL做的控件和用MFC ActiveX wizard的控件有什么区别吧 依存的动态库不一样, 一个是ATL.DLL吧, 一个是MFC42.DLL. ATL开发的控件代码少,轻便,便于网 ...

  7. 第一款个人应用——《不做手机控》——终于上线啦!

    从事Android已经大半年了,居然没有一款自己的产品,真是惭愧啊,不过经过这一个半月的艰苦奋斗,我人生中第一个个人Android应用终于诞生了!叫--不做手机控.感谢老婆大人起的好名字. 这是下载连 ...

  8. 从零开始做远控 第五篇 屏幕监控

    如果你从没看过这系列教程请点击:从零开始做远控 简介篇 屏幕监控: 我们来到进阶课程了,我们这一节主要是讲客户端的,我们将会编写从客户端截取屏幕,然后用JEPG压缩它,最后发给服务端,形成一个动态画面 ...

  9. 从零开始做远控 簡介篇 做一个属于你自己的远控

    做一个属于你自己的远控: 先对大家说句抱歉,上次答应带大家一起做远控但因为我的个人原因让课程中途断了,这次我答应大家一定要把这教程完成.你在看着课程之前你必须掌握c/c++,qt,win32 api. ...

最新文章

  1. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...
  2. 现在,用音频也能指挥GAN生成图像了
  3. Linux 学习之虚拟机下的网络连接
  4. MOOON-scheduler核心设计图(初稿)
  5. 【LDA学习系列】Latent Dirichlet Allocation主题模型理解
  6. Mapper动态代理开发所要遵循的四个原则
  7. mysql中存储gis数据类型_mysql 中的数据类型
  8. 小学生都开始学Python了,你还不抓紧提升技术?
  9. Applet授权细节
  10. NetCat瑞士军刀渗透工具使用详解
  11. iOS越狱开发theOS搭建
  12. 易语言网络验证UI界面源码
  13. OA系统权限分派实施方案
  14. python压缩图片 指定大小
  15. 《阿米巴经营》第一章读后感1200字
  16. 大数据多样性体现在包括_微生物组16S测序又有大动作!升级至NovaSeq PE250,数据量免费升至5万Tags...
  17. 湖北工程学院计算机基础实验报告,学院圆满举行2019级《计算机应用基础》 第一批线上测试试点工作...
  18. 腾讯优图实验室贾佳亚:加入优图第一年 | 专访
  19. android安装sdk时,failed read或者write可能是权限问题
  20. 保存过程中出错,一些数据库对象未被保存

热门文章

  1. 微星主板从u盘启动linux挖矿,三星905s3g BIOS 设置U盘启动
  2. 上周热点回顾(12.5-12.11)
  3. 最佳平方逼近 matlab,matlab最佳平方逼近
  4. H5跳转小程序页面/wx-open-launch-weapp/
  5. 用JavaBean封装数据库操作
  6. 合格前端系列第十弹-揭秘组件库一二事
  7. 多传感器融合感知 --传感器外参标定及在线标定学习
  8. 单摆测重力加速度的算法(Python)
  9. APS高级计划与排程系统基本概念和功能说明
  10. OMG!程序猿小哥是如何做到基金收益率高达26.03%?