题意:

思路: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. [W3School]JavaScript教程学习

    JavaScript 简介 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScript ...

  2. DFS POJ 3087 Shuffle'm Up

    题目传送门 /* 题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子 DFS:直接模拟搜索,用map记录该字符串是否被搜过.读懂题目是关键. */ ...

  3. Windows Server 2008 R2关闭FTP服务

    公司在ZJ的项目给了一台互联网可以访问的测试服务器,但是只给了三个访问端口,而且还做了映射. 映射信息如下:[1050->3389,1051->50000,1053->21] 其中1 ...

  4. jquery实现鼠标移入移除背景图片切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 全志A33平台编译linux(分色排版)sina33

    全志A33平台编译linux 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/12 17:36 版本:V1.0 Xshell 5 (Buil ...

  6. Android requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决方法

    今天在<第一行代码>上学习做自定义标题栏,需要将系统自带的标题栏隐藏掉,使用自定义的标题栏,结果发现,requestWindowFeature(Window.FEATURE_NO_TITL ...

  7. Angular——内置过滤器

    基本介绍 在AngularJS中使用过滤器格式化展示数据,在“{{}}”中使用“|”来调用过滤器,使用“:”传递参数. 基本使用 过滤器可以串起来使用,只要用   |  来衔接就行了,可以将上次返回的 ...

  8. [C#源码]自动更改桌面背景

    操作代码:ChangeDesktop.cs using System;using System.Collections.Generic;using System.ComponentModel;usin ...

  9. Linux服务器文件权限被改

    阿里云买的ubuntu服务器遭受了不明攻击,导致站点访问不了,折腾了很久,才发现是文件的权限被修改了.然后就是一点点的修改,很是麻烦.服务器的安全要重视呢! 1.修改权限 chmod 755 * -R ...

  10. 没搞错吧,我只是个web前端工程师,不是manager,也不是leader...

    那个时候,我只想好好的学习web前端技术,恨不得把有限的时间和精力都放在提升技术上. 然而,让自己在坑里茁壮成长,要先适应坑内的环境. 首当其冲我们要弄明白的事情有: 团队成员的技术能力和状态 Lea ...