题意:

思路: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(主席树,单调栈)的更多相关文章

  1. bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]

    4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...

  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 ...

  3. [AH2017/HNOI2017]影魔(主席树+单调栈)

    设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为 ...

  4. Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...

  5. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  6. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  7. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  8. Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)

    Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...

  9. [BZOJ4826][HNOI2017]影魔(主席树)

    4826: [Hnoi2017]影魔 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 669  Solved: 384[Submit][Status][ ...

随机推荐

  1. React实战之Ant Design—Upload上传_附件上传

    React实战之Ant Design—Upload上传_附件上传 Upload组件大家都在官方文档中看过了,但写的时候还是会遇到许多问题,一些新手看了文档后感觉无从下手,本文过多的简绍就不说了,直接看 ...

  2. activiti遇到的问题

    1.act_hi_detail表里面没有数据 原因是没有加历史变量的判断 2.流程图添加网关,写流转表达式 比如请假流程   大于3天小于5天的条件:${请假实体类.属性名称}

  3. git 详细部署及其应用

    第1章 版本控制系统 自动生成备份.随时回滚.知道改动的地方. 1.1 svn和git的区别 1.1.1 svn 集中式的版本控制系统,只有一个中央数据仓库,如果中央数据库仓库挂了或者不可访问,所有的 ...

  4. ACM_区间调度问题(贪心)

    Meetings 系列一 Time Limit: 2000/1000ms (Java/Others) Problem Description: 多年之后的广财ACM编协如日中天,下系多个部门,且编协成 ...

  5. Android 性能优化(14)网络优化( 10)Determining and Monitoring the Connectivity Status

    Determining and Monitoring the Connectivity Status This lesson teaches you to Determine if you Have ...

  6. 用SpringMVC实现的上传下载

    1.导入相关jar包 commons-fileupload.jar commons-io.jar 2.配置web.xml文件 <?xml version="1.0" enco ...

  7. ActiveMQ命令行工具

    命令行工具 命令行工具 n        activemq——运行activemq代理 n activemq-admin——管理代理的实例 在5.0之前activemq-admin被分成多个脚本,例如 ...

  8. Spring:(三) --常见数据源及声明式事务配置

    Spring自带了一组数据访问框架,集成了多种数据访问技术.无论我们是直接通过 JDBC 还是像Hibernate或Mybatis那样的框架实现数据持久化,Spring都可以为我们消除持久化代码中那些 ...

  9. LN : leetcode 263 Ugly Number

    lc 263 Ugly Number lc 263 Ugly Number Write a program to check whether a given number is an ugly num ...

  10. 1682. [HAOI2014]贴海报

    1682. [HAOI2014]贴海报 ★★☆   输入文件:ha14d.in   输出文件:ha14d.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] Byteto ...