题解:

和这件zhcs的那题有点像

第一种做法是考虑i,i+1之间的贡献

这样子就是矩形加减然后求矩形最小值个数

另一种做法是我们从左向右维护mx-nx-r+l

跟之前那题一样我们知道这个的最小值为0

另外我们只需要从右向左维护一个单调队列,这样区间取min/max(每个数插入删除一次)

就可以变成分段区间+/-操作了

然后这样就变成区间+/-然后查询历史为0的个数

其实这等价于上一种+扫描线

之后这个地方非常套路。。刚开始并没有理解

首先每个点肯定要维护最小值以及最小值个数

我们对每个点再维护一个时间标记,表示这个点是0的时间

注意我们不能去记录这个时间节点是多少

因为这样标记无法合并,我们在区间修改了一个节点后,我们不能即时的对子区间进行修改

然后下一个标记打下来就出错了

我们去记录每个点为0的时间,并且在父亲方向上可以打增加时间的标记

如何在增加了标记之后下传呢

我们考虑这个点以上的标记影响的都是这整个区间

这个区间之前最小值为0的位置,现在也一定是最小值

所以我们判一下它和父亲最小值是否相同就可以了

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
#define me(x) memset(x,0,sizeof(x))
#define ll long long
#define mep(x,y) memcpy(x,y,sizeof(y))
#define mid ((h+t)>>1)
namespace IO{
char ss[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; int Z,C=-;
template<class T>void wer(T x)
{
if (x<) sr[++C]='-',x=-x;
while (z[++Z]=x%+,x/=);
while (sr[++C]=z[Z],--Z);
}
IL void wer1() { sr[++C]=' ';}
IL void wer2() { sr[++C]='\n';}
template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}
template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}
template<class T>IL T MAX(T x,T y) {return x>y?x:y;}
template<class T>IL T MIN(T x,T y) {return x<y?x:y;}
};
using namespace IO;
const int N=1.5e5;
int v[N],q,n,pos[N],cnt,p[N];
struct re{
int a,b,c,d;
}a[N*],b[N*];
ll ans[N*];
void change(int x1,int x2,int y1,int y2,int k)
{
b[++cnt]=(re){x1,y1,y2,k};
b[++cnt]=(re){x2+,y1,y2,-k};
}
const int N1=N*;
struct sgt{
ll now[N1];
int tim[N1],num[N1],v[N1],lazy[N1];
void build(int x,int h,int t)
{
num[x]=(t-h+);
if (h==t) return;
build(x*,h,mid); build(x*+,mid+,t);
}
IL void down(int x)
{
if (lazy[x])
{
lazy[x*]+=lazy[x]; lazy[x*+]+=lazy[x];
v[x*]+=lazy[x]; v[x*+]+=lazy[x];
lazy[x]=;
}
if (tim[x])
{
if (v[x*]==v[x])
{
now[x*]+=1ll*tim[x]*num[x*];
tim[x*]+=tim[x];
}
if (v[x*+]==v[x])
{
now[x*+]+=1ll*tim[x]*num[x*+];
tim[x*+]+=tim[x];
}
tim[x]=;
}
}
IL void updata(int x)
{
now[x]=now[x*]+now[x*+];
v[x]=MIN(v[x*],v[x*+]);
num[x]=;
if (v[x]==v[x*]) num[x]+=num[x*];
if (v[x]==v[x*+]) num[x]+=num[x*+];
}
void change(int x,int h,int t,int h1,int t1,int k)
{
if (h1<=h&&t<=t1)
{
v[x]+=k; lazy[x]+=k; return;
}
down(x);
if (h1<=mid) change(x*,h,mid,h1,t1,k);
if (mid<t1) change(x*+,mid+,t,h1,t1,k);
updata(x);
}
ll query(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1) return(now[x]);
down(x);
ll ans=;
if (h1<=mid) ans+=query(x*,h,mid,h1,t1);
if (mid<t1) ans+=query(x*+,mid+,t,h1,t1);
return ans;
}
}S;
bool cmp(re x,re y)
{
return x.a<y.a;
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
read(n);
rep(i,,n) read(v[i]),pos[v[i]]=i;
rep(i,,n-)
{
change(,i,i+,n,);
change(i+,n,,i,);
int x1=pos[i],x2=pos[i+];
if (x1>x2) swap(x1,x2);
change(,x1,x2,n,-);
change(x2,n,,x1,-);
}
read(q);
int q1=q*;
rep(i,,q)
{
int x,y;
read(x); read(y);
a[i*-]=(re){y,y,i*-};
a[i*-]=(re){x-,y,i*-};
a[i*-]=(re){y,x-,i*-};
a[i*]=(re){x-,x-,i*};
p[i]=y-x+;
}
int now=,lst=;
S.build(,,n);
sort(a+,a+q1+,cmp);
sort(b+,b+cnt+,cmp);
rep(i,,q1)
{
while(now<=cnt&&b[now].a<=a[i].a)
{
S.tim[]+=b[now].a-lst; S.now[]+=1ll*(b[now].a-lst)*S.num[];
lst=b[now].a;
S.change(,,n,b[now].b,b[now].c,b[now].d);
now++;
}
S.tim[]+=a[i].a+-lst; S.now[]+=1ll*(a[i].a+-lst)*S.num[];
lst=a[i].a+;
if (a[i].b) ans[a[i].c]=S.query(,,n,,a[i].b);
}
rep(i,,q)
wer((ans[i*-]-ans[i*-]-ans[i*-]+ans[i*]-p[i])/+p[i]),wer2();
fwrite(sr,,C+,stdout);
return ;
}

codeforces 493 div1 e的更多相关文章

  1. codeforces 407 div1 B题(Weird journey)

    codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...

  2. codeforces 407 div1 A题(Functions again)

    codeforces 407 div1 A题(Functions again) Something happened in Uzhlyandia again... There are riots on ...

  3. Codeforces 493 E.Devu and Birthday Celebration

    \(>Codeforces \space 493\ E.Devu\ and\ Birthday\ Celebration<\) 题目大意 : 有 \(q\) 组询问,每次有 \(n\) 小 ...

  4. codeforces #305 div1 done

    总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...

  5. Codeforces #254 div1 B. DZY Loves FFT 暴力乱搞

    B. DZY Loves FFT 题目连接: http://codeforces.com/contest/444/problem/B Description DZY loves Fast Fourie ...

  6. codeforces #313 div1 E

    首先我们要注意到一个事情 如果一个灯塔向左覆盖,那么比他小的某个灯塔如果向左覆盖的端点大于当前塔向左覆盖的端点,他一定向右覆盖 对于当前灯塔向右覆盖也是同理 那么我们只需要记录当前覆盖到的端点就可以完 ...

  7. codeforces #313 div1 D

    好神的题目! 首先我们运用pick定理A=S-B/2+1将要求的东西转化掉 之后分离变量,我们变成了求选取凸包面积的期望和求选取凸包在边界上的点的期望 我们先考虑求选取凸包面积的期望 如何计算凸多边形 ...

  8. codeforces #313 div1 C

    同BZOJ 3782 上学路线 QAQ 还比那个简单一点 把坐标(1,1)-(n,m)平移成(0,0)-(n-1,m-1) 设dp[i]表示从(1,1)出发第一次经过障碍且到达第i个障碍的方案数 首先 ...

  9. codeforces #313 div1 B

    模拟判定就可以了 判定字符串是否相等用hash来判断 QAQ 值得一提的是一开始我交的时候T了 结果我将递归的顺序调整了一下就A了 (并不知道为什么 #include<cstdio> #i ...

随机推荐

  1. 【数学建模】偏最小二乘回归分析(PLSR)

    PLSR的基本原理与推导,我在这篇博客中有讲过. 0.偏最小二乘回归集成了多元线性回归.主成分分析和典型相关分析的优点,在建模中是一个更好的选择,并且MATLAB提供了完整的实现,应用时主要的问题是: ...

  2. MT【320】依次动起来

    已知$ BC=6,AC=2AB, $点$ D $满足$ \overrightarrow{AD}=\dfrac{2x}{x+y}\overrightarrow{AB}+\dfrac{y}{2(x+y)} ...

  3. 关于data()获取不到得原因

    ..原因很简单,版本高低问题  从jQuery 1.4.3起, HTML 5 data- 属性 将自动被引用到jQuery的数据对象中.  所以,还是尽量保持用attr来获取自定义属性

  4. docker_监控

    目录 Docker 自带的监控子命令 sysdig Weave Scope cAdvisor Prometheus Prometheus 的架构 多维数据模型 Docker 自带的监控子命令 ps d ...

  5. Django 中使用kindeditor

    KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(textarea)替换为可视化的富文本 ...

  6. 精通Dubbo——Dubbo支持的协议的详解

    转: 精通Dubbo——Dubbo支持的协议的详解 2017年06月02日 22:26:57 孙_悟_空 阅读数:44500   Dubbo支持dubbo.rmi.hessian.http.webse ...

  7. 主机管理+堡垒机系统开发:strace命令及日志解析(五)

    一.strace命令简介 测试命令截图 第一个窗口执行命令如下 [root@elk ~]# w 16:51:56 up 3 days, 6:01, 3 users, load average: 0.0 ...

  8. vim与程序员

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  9. [浏览器事件循环] javaScript事件循环 EventLoop

    前言 Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理. 先熟悉基本概念 [堆Heap] 堆是一种数据结构 ...

  10. 五十、进程间通信——System V IPC 之共享内存

    50.1 共享内存 50.1.1 共享内存的概念 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间.所有用户空间的进程若要操作共享内存,都要将其映射到自己 ...