【ZJOI2017 Round2练习&BZOJ4826】D1T2 sf(主席树,单调栈)
题意:


思路:From http://blog.csdn.net/neither_nor/article/details/70211150
对每个点i,单调栈求出左边和右边第一个大于i的位置,记为l[i]和r[i]
那么(l[i],r[i])会产生p1的贡献
左端点为l[i],右端点在[i+1,r-1]的点对都会产生p1的贡献
右端点为r[i],左端点在[l+1,i-1]的点对都会产生p2的贡献
将点对看成平面上的点,横坐标左端点纵坐标右端点,上述贡献分别对应单点加和线段加
查询就是矩形求和
From MG:
考虑修改均为如(x,y1..y2)与(x1..x2,y)形式
因为询问均为矩形,则修改(y1..y2,x)与(x,y1..y2)等价
若统一转化为(x,y1..y2)形式,可用主席树维护
若统一转化为(y1..y2,x)形式,可用树状数组套主席树维护
注意点对(i,i)都有p1的贡献
var t:array[..]of record
a,s:int64;
l,r:longint;
end;
d:array[..,..]of longint;
l,r:array[..]of longint;
root,stk,a:array[..]of longint;
n,m,i,cnt,j,top,que,x,y,p1,p2:longint;
ans:int64; procedure update(l,r,x,y,v:longint;var p:longint);
var mid:longint;
begin
if (l>x)or(x>y) then exit;
inc(cnt); t[cnt]:=t[p]; p:=cnt;
t[p].s:=t[p].s+int64(v)*(y-x+);
if (l=x)and(r=y) then
begin
t[p].a:=t[p].a+v;
exit;
end;
mid:=(l+r)>>;
if y<=mid then update(l,mid,x,y,v,t[p].l)
else if x>mid then update(mid+,r,x,y,v,t[p].r)
else
begin
update(l,mid,x,mid,v,t[p].l);
update(mid+,r,mid+,y,v,t[p].r);
end;
end; procedure query(l,r,x,y,p1,p2:longint);
var mid:longint;
begin
if (l=x)and(r=y) then
begin
ans:=ans+t[p1].s-t[p2].s;
exit;
end;
ans:=ans+(t[p1].a-t[p2].a)*(y-x+);
mid:=(l+r)>>;
if y<=mid then query(l,mid,x,y,t[p1].l,t[p2].l)
else if x>mid then query(mid+,r,x,y,t[p1].r,t[p2].r)
else
begin
query(l,mid,x,mid,t[p1].l,t[p2].l);
query(mid+,r,mid+,y,t[p1].r,t[p2].r);
end;
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=d[(l+r)>>,];
repeat
while mid>d[i,] do inc(i);
while mid<d[j,] do dec(j);
if i<=j then
begin
swap(d[i,],d[j,]);
swap(d[i,],d[j,]);
swap(d[i,],d[j,]);
swap(d[i,],d[j,]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; begin
assign(input,'bzoj4826.in'); reset(input);
assign(output,'bzoj4826.out'); rewrite(output);
readln(n,que,p1,p2);
for i:= to n do read(a[i]);
top:=; stk[top]:=; a[]:=maxlongint;
for i:= to n do
begin
while (top>)and(a[i]>a[stk[top]]) do dec(top);
if top= then l[i]:=
else l[i]:=stk[top];
inc(top); stk[top]:=i;
end;
top:=; stk[top]:=n+; a[n+]:=maxlongint;
for i:=n downto do
begin
while (top>)and(a[i]>a[stk[top]]) do dec(top);
if top= then r[i]:=n+
else r[i]:=stk[top];
inc(top); stk[top]:=i;
end;
for i:= to n do
begin
if (l[i]>)and(r[i]<=n) then
begin
inc(m); d[m,]:=l[i]; d[m,]:=r[i]; d[m,]:=r[i]; d[m,]:=p1;
end;
if l[i]> then
begin
inc(m); d[m,]:=l[i]; d[m,]:=i+; d[m,]:=r[i]-; d[m,]:=p2;
end;
if r[i]<=n then
begin
inc(m); d[m,]:=r[i]; d[m,]:=l[i]+; d[m,]:=i-; d[m,]:=p2;
end;
end;
qsort(,m);
j:=;
for i:= to n do
begin
root[i]:=root[i-];
while (j<=m)and(d[j,]=i) do
begin
update(,n,d[j,],d[j,],d[j,],root[i]);
inc(j);
end;
end;
for i:= to que do
begin
readln(x,y);
ans:=(y-x)*p1;
query(,n,x,y,root[y],root[x-]);
writeln(ans);
end;
close(input);
close(output);
end.
【ZJOI2017 Round2练习&BZOJ4826】D1T2 sf(主席树,单调栈)的更多相关文章
- bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...
- 【BZOJ3956】Count 主席树+单调栈
[BZOJ3956]Count Description Input Output Sample Input 3 2 0 2 1 2 1 1 1 3 Sample Output 0 3 HINT M,N ...
- [AH2017/HNOI2017]影魔(主席树+单调栈)
设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为 ...
- Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)
Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...
- [BZOJ4826][HNOI2017]影魔(主席树)
4826: [Hnoi2017]影魔 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 669 Solved: 384[Submit][Status][ ...
随机推荐
- 慕课网6-4 编程练习:jQuery选择器中的过滤器
6-4 编程练习 结合所学的jQuery过滤器知识,实现如下图所示的隔行换色效果 任务 使用jQuery的.css()方法设置样式,语法css('属性 '属性值') 使用:odd和:even过滤器实现 ...
- Linux学习系列八:操作网口
一些相对高性能的单片机会带以太网接口,网口在MCU里算是比较复杂的外设了,因为它涉及到网络协议栈,通常情况下网络协议栈会运行在一个RTOS中,所以对普通单片机开发者来说网口使用起来相对难度较大一些.在 ...
- deepin 安装 idea
1.su root 2.sudo apt install idea 3.sudo vi /etc/hosts 最后一行添加 0.0.0.0 account.jetbrains.com 4.注册码 N7 ...
- LOJ#120. 持久化序列(FHQ Treap)
题面 传送门 题解 可持久化\(Treap\)搞一搞 //minamoto #include<bits/stdc++.h> #define R register #define inlin ...
- PowerDesigner 的使用教程
PowerDesigner 的使用这两篇博客挺好,我也是跟着学习,就不再写了: 初步学习: http://www.cnblogs.com/huangcong/archive/2010/06/14/17 ...
- 清理TIME_WAIT
cat >> /etc/sysctl.conf << EOFnet.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1net.ipv4.t ...
- [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解
一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...
- SQL数据库——静态成员
静态: 1.普通成员普通成员都是属于对象的用对象调用 2.静态成员静态成员是属于类的用类名调用 stactic 静态关键字 静态方法里面不能包含普通成员普通方法里面可以包含静态成员 静态: 1.普通成 ...
- C++中图片重命名
非常简单的小程序,满足自己的需求. #include <iostream> #include <fstream> #include<sstream> using n ...
- Java设置全局热键——第三方包jintellitype实现
Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实 ...