Description

影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。千百年来,他收集了各式各样的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。
每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击。
奈文摩尔有n个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号1到n。第i个灵魂的战斗力为k[i],灵魂们以点对的形式为影魔提供攻击力,对于灵魂对i,j (i<j) (i来说,若不存在 k[s](i<s<j) k[s](i大于k[i]或者k[j],则会为影魔提供p1的攻击力(可理解为:当j=i+1时,因为不存在满足 i<s<j i的s,从而k[s]不存在,这时提供p1的攻击力;当j>i+1时,若 maxk[s]|i<s<j<=mink[i],k[j] max{k[s]|i,则提供p1的攻击力);另一种情况,令c为k[i+1],k[i+2],k[i+3]……k[j-1]的最大值,若c满足: k[i]<c<k[j] k[i],或者 k[j]<c<k[i] k[j],则会为影魔提供p2的攻击力,当这样的c不存在时,自然不会提供这p2的攻击力;其他情况的点对,均不会为影魔提供攻击力。
影魔的挚友噬魂鬼在一天造访影魔体内时被这些灵魂吸引住了,他想知道,对于任意一段区间[a,b], 1<=a<b<=n 1,位于这些区间中的灵魂对会为影魔提供多少攻击力,即考虑所有满足 a<=i<j<=b a的灵魂对i,j提供的攻击力之和。
顺带一提,灵魂的战斗力组成一个1到n的排列:k[1],k[2],…,k[n]。

Input

输入文件名为sf.in。
第一行n,m,p1,p2
第二行n个数:k[1],k[2],…,k[n]
接下来m行,每行两个数a,b,表示询问区间[a,b]中的灵魂对会为影魔提供多少攻击力。

Output

输出文件名为sf.out
共输出m行,每行一个答案,依次对应m个询问。

Sample Input

10 5 2 3
7 9 5 1 3 10 6 8 2 4
1 7
1 9
1 3
5 9
1 5

Sample Output

30
39
4
13
16

Data Constraint

30%:1<= n,m <= 500。
另30%: p1=2*p2。
100%:1 <= n,m <= 200000;1 <= p1,p2 <= 1000。

题解

正常一点的解法就是主席树强行维护一波咯,但是我并不会区间加入(为什么我怎么想都觉得会爆空间呢?),本来以为这题不可改,但是良心的题解提供了另外一种很优秀的解法
我们考虑用扫描线来解决这个问题,我们可以把某一个点作为左端点和右端点的贡献(而且是较高的那个端点)分开来考虑
首先用单调栈处理出每一个点的下一个和上一个比它高的位置
设为next[i]以及last[i]
对于左端点:
假设我们当前的扫描线扫描到了i,那么我们就先钦定[i+1,next[i]]这一段都获得p2的贡献,而在next[i]右边的点肯定是和i没有关系的,就算有(比如说比next[i]还要高的点)也会在计算以那个点为右端点的时候被计算到,这样就可以巧妙的去重了
然后是关键,如果有next[i],我们将它单点加p1-2*p2,为什么要这样加呢?
我们可以用一个例子来解释
设现在有两个位置i,j且这个点对的贡献为p1,由于给的序列是一个排列,所以肯定有其中一个大于另外一个
那么以i为左端点以及以j为右端点时都会给对方p2的贡献,加起来也就是2*p2,所以我们要把它约掉,然后再加上p1
最后由于我们是扫描线,所以说每次做之前要先把询问数组拍一下序,然后对于左端点,我们从右到左扫,贡献就是当前线段树的[1,q[i,2]]这些叶子节点的贡献和,类似的,对于右端点,我们的扫描线从左往右扫,贡献就是[q[i,1],n]

其实主要的思路就是先通过扫描线搞定其中的一个限制,然后把贡献放在线段树上与另外一个限制有关的位置放上相应的贡献,通过区间的操作维护答案

贴代码

vartree,lazy:array[0..700005]of int64;next,last,gt,st:array[0..200005]of longint;ans:array[0..200005]of int64;q:array[0..200005,1..3]of longint;i,j,k,l,m,n,p1,p2,x,y,z,p:longint;tot:int64;
procedure qsort(l,r:longint);
vari,j,mid:longint;
begini:=l;j:=r;mid:=q[(i+j) div 2,1];repeatwhile q[i,1]<mid do inc(i);while q[j,1]>mid do dec(j);if i<=j thenbeginq[0]:=q[i];q[i]:=q[j];q[j]:=q[0];inc(i);dec(j);end;until i>j;if i<r then qsort(i,r);if l<j then qsort(l,j);
end;
procedure qsort1(l,r:longint);
vari,j,mid:longint;
begini:=l;j:=r;mid:=q[(i+j) div 2,2];repeatwhile q[i,2]<mid do inc(i);while q[j,2]>mid do dec(j);if i<=j thenbeginq[0]:=q[i];q[i]:=q[j];q[j]:=q[0];inc(i);dec(j);end;until i>j;if i<r then qsort1(i,r);if l<j then qsort1(l,j);
end;
procedure fi(l,r,v:longint);
begintree[v]:=tree[v]+(r-l+1)*lazy[v];if l<>r thenbegininc(lazy[v*2],lazy[v]);inc(lazy[v*2+1],lazy[v]);end;lazy[v]:=0;
end;
procedure change(v,l,r,x,y,z:longint);
varmid:longint;
begintree[v]:=tree[v]+(r-l+1)*lazy[v];if l<>r thenbegininc(lazy[v*2],lazy[v]);inc(lazy[v*2+1],lazy[v]);end;lazy[v]:=0;if (l=x) and (r=y) thenbegintree[v]:=tree[v]+(r-l+1)*z;if l<>r thenbeginlazy[v*2]:=lazy[v*2]+z;lazy[v*2+1]:=lazy[v*2+1]+z;end;endelsebeginmid:=(l+r) div 2;if y<=mid then change(v*2,l,mid,x,y,z) elseif x>mid then change(v*2+1,mid+1,r,x,y,z) elsebeginchange(v*2,l,mid,x,mid,z);change(v*2+1,mid+1,r,mid+1,y,z);end;if lazy[v*2+1]<>0 thenbeginfi(mid+1,r,v*2+1);end;if lazy[v*2]<>0 then fi(l,mid,v*2);tree[v]:=tree[v*2]+tree[v*2+1];end;
end;
procedure find(v,l,r,x,y:longint);
varmid:longint;
begintree[v]:=tree[v]+(r-l+1)*lazy[v];if l<>r thenbegininc(lazy[v*2],lazy[v]);inc(lazy[v*2+1],lazy[v]);end;lazy[v]:=0;if (l=x) and (r=y) then tot:=tot+tree[v] elsebeginmid:=(l+r) div 2;if y<=mid then find(v*2,l,mid,x,y) elseif x>mid then find(v*2+1,mid+1,r,x,y) elsebeginfind(v*2,l,mid,x,mid);find(v*2+1,mid+1,r,mid+1,y);end;end;
end;
beginassign(input,'sf.in'); reset(input);assign(output,'sf.out'); rewrite(output);readln(n,m,p1,p2);for i:=1 to n do read(gt[i]);readln;x:=1;st[1]:=1;for i:=2 to n dobeginwhile (gt[i]>gt[st[x]]) and (x>0) dobeginnext[st[x]]:=i;dec(x);end;inc(x);st[x]:=i;end;x:=1;st[1]:=n;for i:=n-1 downto 1 dobeginwhile (gt[i]>gt[st[x]]) and (x>0) dobeginlast[st[x]]:=i;dec(x);end;inc(x);st[x]:=i;end;for i:=1 to m do readln(q[i,1],q[i,2]);for i:=1 to m do q[i,3]:=i;qsort(1,m);x:=m;for i:=n downto 1 dobeginif next[i]<>0 thenbeginchange(1,1,n,i+1,next[i],p2);change(1,1,n,next[i],next[i],p1-2*p2);end elseif i<>n thenchange(1,1,n,i+1,n,p2);while i=q[x,1] dobegintot:=0;find(1,1,n,1,q[x,2]);ans[q[x,3]]:=ans[q[x,3]]+tot;dec(x);if x=0 then break;end;if x=0 then break;end;fillchar(tree,sizeof(tree),0);fillchar(lazy,sizeof(lazy),0);qsort1(1,m);x:=1;for i:=1 to n dobeginif last[i]<>0 thenbeginchange(1,1,n,last[i],i-1,p2);change(1,1,n,last[i],last[i],p1-2*p2);end elseif i<>1 thenchange(1,1,n,1,i-1,p2);while i=q[x,2] dobegintot:=0;find(1,1,n,q[x,1],n);ans[q[x,3]]:=ans[q[x,3]]+tot;inc(x);if x>m then break;end;if x>m then break;end;for i:=1 to m do writeln(ans[i]);close(input); close(output);
end.

bzoj4826 hnoi2017影魔相关推荐

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

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

  2. Bzoj4826 [Hnoi2017]影魔

    Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 425  Solved: 244 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实 ...

  3. [题解]bzoj4826 HNOI2017 影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵 ...

  4. BZOJ4826: [Hnoi2017]影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...

  5. bzoj4826[hnoi2017]影魔

    题意:每次询问一个区间[l,r],问[l,r]中的每一对(i,j)能够贡献多少总加成?给定序列a是1~n的一个排列,也就是a[i]两两不同. 设z=max{a[i+1],a[i+2],...,a[j- ...

  6. [AH2017/HNOI2017]影魔

    P3722 [AH2017/HNOI2017]影魔 题解: 法一: [bzoj4826][HNOI2017]影魔 直接转化成区间内单点的贡献, 分开p1,p2考虑 而min(ai,aj),max(ai ...

  7. 【BZOJ4826】[Hnoi2017]影魔 单调栈+扫描线

    [BZOJ4826][Hnoi2017]影魔 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝 ...

  8. [AH2017/HNOI2017] 影魔

    [AH2017/HNOI2017]影魔 30pts 暴力在每个区间中枚举点对(a,b)(a,b)(a,b)并查询点对之间的最大值maxmaxmax,若max<=min(a,b)max<=m ...

  9. bzoj 4826 [Hnoi2017]影魔

    http://www.elijahqi.win/archives/3687 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式 ...

最新文章

  1. 首次成功实施 XSS 攻击,盗取目标网站大量 VIP 帐号
  2. [转载]TFS安装配置教程
  3. golang存储密码
  4. C# 文件操作详解(三)---------Directory类
  5. 从java到C++入门
  6. 【转】dcmtk程序包综述(1)!!!!!!
  7. JAVA方法重载与构造方法简介
  8. 机器学习基础:评价指标(Machine Learning Fundamentals: Evaluation Metrics)
  9. 江苏计算机二级c语言考试范围,江苏省计算机二级C语言考试大纲
  10. 中国分布式光纤传感(DFOS)行业竞争现状与未来趋势预测报告2022-2027
  11. 器件选型基本总则及选型标准
  12. 2021中兴捧月神算师算法赛,4-24第一场,第二题:B - 切绳子,2021-4-27
  13. ROS学习【3】-----ROS通信编程:小乌龟走正方形
  14. 如何通过TXT文件批量生成DataMatrix码
  15. mysql修改frm,MySQL 修改.frm文件来更新字段
  16. 《路由器开发 - 路由器刷机指南》小米MINI刷机
  17. 页错误处理 Page Fault Handling
  18. 在win xp上使用pyqt5
  19. python中次方怎么表示_python中n次方怎么表示
  20. uni-app - 实现全屏自适应且不变形背景大图,设置一张图片占满全屏(根据手机或电脑尺寸自动拉伸背景图像),用于页面是一张平铺的大图做背景的情况,全端兼容

热门文章

  1. 浏览器控制台花式打印 typescript全局注入
  2. java我的世界物品_我的世界:Java版独享!被隐藏的世界类型,包含各种罕见道具!...
  3. vue3 组件拖拽小案例
  4. github无法登陆的解决办法
  5. TI基于GaN的图腾柱PFC应用介绍直播笔记-TIDA00961-电子研习社
  6. 小学知识点~句式全覆盖专题
  7. 小辣鸡的Android开发之路-应用冻结器-4-实现应用的禁止和解禁
  8. 什么是泛在电力物联网?如何建设泛在电力物联网?——安科瑞 严新亚
  9. Linux中ps命令介绍
  10. openstack的topo图