P3722 [AH2017/HNOI2017] 影魔

news/2024/12/25 21:43:56/文章来源:https://www.cnblogs.com/LG017/p/18631474

P3722 [AH2017/HNOI2017] 影魔

题目背景

影魔,奈文摩尔,据说有着一个诗人的灵魂。事实上,他吞噬的诗人灵魂早已成千上万。

千百年来,他收集了各式各样的灵魂,包括诗人、牧师、帝王、乞丐、奴隶、罪人,当然,还有英雄。

每一个灵魂,都有着自己的战斗力,而影魔,靠这些战斗力提升自己的攻击。

题目描述

奈文摩尔有 \(n\) 个灵魂,他们在影魔宽广的体内可以排成一排,从左至右标号 \(1\)\(n\)。第 \(i\) 个灵魂的战斗力为 \(k_i\),灵魂们以点对的形式为影魔提供攻击力。对于灵魂对 \(i, j\ (i<j)\) 来说,若不存在 \(k_s\ (i<s<j)\) 大于 \(k_i\) 或者 \(k_j\),则会为影魔提供 \(p_1\) 的攻击力。另一种情况,令 \(c\)\(k_{i + 1}, k_{i + 2}, \cdots, k_{j -1}\) 的最大值,若 \(c\) 满足:\(k_i < c < k_j\),或者 \(k_j < c < k_i\),则会为影魔提供 \(p_2\) 的攻击力,当这样的 \(c\) 不存在时,自然不会提供这 \(p_2\) 的攻击力;其他情况的点对,均不会为影魔提供攻击力。

影魔的挚友噬魂鬼在一天造访影魔体内时被这些灵魂吸引住了,他想知道,对于任意一段区间 \([a, b]\),位于这些区间中的灵魂对会为影魔提供多少攻击力,即考虑所有满足 \(a\le i<j\le b\) 的灵魂对 \(i, j\) 提供的攻击力之和。

顺带一提,灵魂的战斗力组成一个 \(1\)\(n\) 的排列:\(k_1, k_1, \cdots, k_n\)

提示

对于 \(100\%\) 的数据,\(1\le n,m\le 200000, 1\le p_1, p_2\le 1000\)

Solution:

题意简述:给定一个排列 \({k_n}\) ,对于 \(i<c \le j\) 的三元组有以下两类贡献:

\(p_1\): \(k_i,k_j\) 有一个是区间最大值,另一个是次大值

\(p_2\): \(min(k_i,k_j)<k_c<max(k_i,k_j)\)

我们考虑对一个点 \(pos\) 分别求出左右两边第一个比它大的 \(k\) 的下标 \(L,R\) 可以用单调栈在 \(O(n)\) 解决

然后我们考虑如何刻画这个三元组的贡献:

\(k_L,k_R\)\(k_i,k_{i+1}\) 显然分别对区间 \([L,R]\)\([i,i+1]\)\(p_1\) 的贡献

\(L,R,pos\) 显然满足一个东西

$\forall i\in[R+1,i-1] R>k_{pos}>p_i $

\(\forall i\in[i+1,R-1] L>k_{pos}>p_i\)

所以:

\(\forall i\in[i+1,R-1]\) 会在 \([L,i]\) 上产生 \(p_2\) 的贡献

\(\forall i\in[R+1,i-1]\) 会在 \([i,R]\) 上产生\(p_2\) 的贡献

这可太线段树了

我们开一颗主席树,以每个区间的左端点作为 \(rt\) 然后线段树上的下标对应右端点的区间,然后我们的贡献就可以这样维护:

if(i<n)E[i].emplace_back(i+1,i+1,p1);
if((1<=l)&&(r<=n))E[l].emplace_back(r,r,p1);
if((1<=l)&&(i+1<=r-1))E[l].emplace_back(i+1,r-1,p2);
if((l+1<=i-1)&&(r<=n))E[r].emplace_back(l+1,i-1,p2);

然后每次查询就是

ans=T.query(T.rt[l-1],T.rt[r],1,n,l,r);

然后注意一个东西,由于我的主席树的下标是挂在询问上的,所以最好写标记永久化,不然不好写 \(pushdown\)

Code

#include<bits/stdc++.h>
#define int long long
const int N=2e5+5;
using namespace std;
//Segment_Tree
struct Segment_Tree{int cnt;int rt[N];struct Tree{int ls,rs,val,tag;}t[N*64];void insert(int &x,int y,int l,int r,int L,int R,int k){t[x=++cnt]=t[y];int len=(-max(L,l)+min(r,R)+1);t[x].val+=len*k;if(L<=l&&r<=R){t[x].tag+=k;return ;}int mid=l+r>>1;if(L<=mid)insert(t[x].ls,t[y].ls,l,mid,L,R,k);if(mid<R) insert(t[x].rs,t[y].rs,mid+1,r,L,R,k);}int query(int x,int y,int l,int r,int L,int R){if(!y)return 0;int len=(-max(L,l)+min(r,R)+1);if(L<=l&&r<=R){return (-t[x].val+t[y].val);}int mid=l+r>>1,res=0;if(L<=mid)res+=query(t[x].ls,t[y].ls,l,mid,L,R);if(mid<R) res+=query(t[x].rs,t[y].rs,mid+1,r,L,R);res+=len*(-t[x].tag+t[y].tag);return res;}
}T;
int n,m,p1,p2;
int a[N],st[N],L[N],R[N];
vector<tuple<int,int,int> >E[N];
void work()
{cin>>n>>m>>p1>>p2;for(int i=1;i<=n;i++){scanf("%lld",&a[i]);while(st[0]&&a[st[st[0]]]<a[i]){R[st[st[0]]]=i;st[0]--;}L[i]=st[st[0]];st[++st[0]]=i;}while(st[0]){R[st[st[0]]]=n+1;st[0]--;}for(int i=1;i<=n;i++){int l=L[i],r=R[i];if(i<n)E[i].emplace_back(i+1,i+1,p1);if((1<=l)&&(r<=n))E[l].emplace_back(r,r,p1);if((1<=l)&&(i+1<=r-1))E[l].emplace_back(i+1,r-1,p2);if((l+1<=i-1)&&(r<=n))E[r].emplace_back(l+1,i-1,p2);}for(int i=1;i<=n;i++){T.rt[i]=T.rt[i-1];for(auto [l,r,w] : E[i]){T.insert(T.rt[i],T.rt[i],1,n,l,r,w);}}for(int i=1,l,r;i<=m;i++){scanf("%lld%lld",&l,&r);int ans=T.query(T.rt[l-1],T.rt[r],1,n,l,r);printf("%lld\n",ans);}
}
#undef int
int main()
{//freopen("P3722.in","r",stdin);freopen("P3722.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R数据分析:工具变量回归的做法和解释,实例解析

前几天看了个视频,是2024年诺贝尔经济学奖得主在分享自己的研究,研究问题是“制度如何形成并影响经济繁荣”,在研究这个问题的时候他的PPT中提到研究的统计过程中用到了工具变量,想着再次大家介绍一下这个方法。说不定利用这个方法,哪天我的读者里面也出个诺贝尔奖得主呢,…

昆工25考研复试时间预测(信自院)

昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、计算机应用技术、通信工程、817信号与系统、信号与信息处理、通信与信息系统、通信工程(含宽带网络、移动通信等)

WebP图片格式

WebP WebP 是一种图片文件格式,由 Google 开发,用于提供更好的图像压缩性能。支持有损压缩和无损压缩,同时支持透明度(类似 PNG 格式的 alpha 通道)和动画(类似 GIF 格式)。 WebP特点高效压缩 •有损压缩:与 JPEG 相比,WebP 的文件体积更小,同时保持类似的图像质量。…

谁让你创建两个对象的?

如果CLASSPATH下有两个不同版本的jar包,一个版本的jar包有@Component注解,另外一个版本没有,Spring到底会不会创建Bean?问题现象 之前遇到过一个问题,在一个微服务的目录下有相同功能 jar 包的两个不同的版本,其中一个版本里面的类有 @Component 注解,另外一个版本的类里…

打印三角形金字塔 、debug、java的方法、命令行传参、可变参数20241225

打印三角形金字塔 debug20241225package com.pangHuHuStudyJava.struct; public class Print_Tran {public static void main(String[] args) {for (int j = 0; j < 5; j++) {for (int r = 5; r > j; r--) {System.out.print( );}for (int s = 0; s < ((2*j)+1); s++…

OpenAI o3模型震撼发布:编程界的革命性突破,程序员的未来将何去何从?

当人工智能踏足编程领域,生产力的提升让人瞠目结舌。就在近日,OpenAI 发布了全新的 o3模型,其强大的代码生成能力和上下文理解能力,将编程带入了一个全新的时代。是机遇还是挑战?程序员们将如何面对这场技术风暴?o3模型究竟有何与众不同之处?它的发布会对程序员和整个软…

[Java/压缩] Java读取Parquet文件

序:契机生产环境有设备出重大事故,又因一关键功能无法使用,亟需将生产环境的原始MQTT报文(以 parquet 文件格式 + zstd 压缩格式 落盘)DOWN到本地,读取并解析。本文聚焦在 本地电脑,用 java 读取 parquet 文件相当多网络文档的读取代码无法正常运行,有必要记录一二,后续…

莫队从入门到人门

普通莫队 详介(P2709 小B的询问) 普通莫队处理问题的前提是问题可以离线,多次区间查询,\(O(n\sqrt m)\) 能过。 我们以 P2709 小B的询问 为例,假设当前区间为 \([l,r]\),答案为 \(ans\),那么 \(r\) 右移一位时,新加入一个数 \(x\),我们只要把 \(ans\) 加上 \(x\) 的贡…

nacos安装注意事项

一年多没玩了,都快忘了,最新版本已经2.3.x了 3.0也快问世了 Linux/Unix/Mac 单机启动命令: sh startup.sh -m standalone Windows startup.cmd -m standalone如果直接未启动就是集群模式,但是要注意nacos.properties里面配置集群信息本文来自博客园,作者:余生请多指教ANT…

PWN系列-2.27版本利用setcontext实现orw

PWN系列-2.27版本利用setcontext实现orw 知识 开启沙箱之后,我们就只能用orw的方式来得到flag。 这篇博客主要讲通过劫持__free_hook或者__malloc_hook利用setcontext在libc或者heap上执行rop或者shellcode。 在free堆块的时候,rdi会指向堆块,在检测到__free_hook有值的情况…

shell语法保姆级教程

Shell脚本 建立一个sh脚本 touch 1.sh (新建脚本文件)vi 1.sh(编写文件内容)按 i 可以写入内容,按esc :wq退出并保存解释 1、创建脚本文件 2、脚本文件中第一行为指定脚本编译器:# !/bin/bash 最终调用的都是dash执行shell脚本命令: 1、./1.sh难道我们必须要修改权限才能执…

从0开始学uniapp——认识HBuilderX

为什么使用uniapp:可以多端运行,写好了这一套可以用在h5,安卓程序,小程序多端,很方便。1.百度搜HBuilderX,使用该编译器学习uniapp 2.新建一个默认项目 pages——用于存放页面,这里都是.vue后缀的页面, pages.json——用于存放路由pages数组里按例子添加即可,HBuilder…