首页 > 其他分享 >P3722 [AH2017/HNOI2017] 影魔

P3722 [AH2017/HNOI2017] 影魔

时间:2024-12-25 21:41:09浏览次数:3  
标签:le 影魔 int pos AH2017 HNOI2017 forall 灵魂

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;
}

标签:le,影魔,int,pos,AH2017,HNOI2017,forall,灵魂
From: https://www.cnblogs.com/LG017/p/18631474

相关文章

  • 使用光影魔术手的色彩调整功能,让你的照片更具活力
    前言你是否曾经因为处理繁琐的照片而感到无从下手?是否在忙碌的工作中想要快速修整图片,却因为复杂的软件操作而拖延了时间?光影魔术手就是为了解决这些问题而诞生的。它不仅是一款功能强大的批量图像处理工具,更是一位高效的助手,帮助你在繁忙的工作中节省宝贵的时间,提高办公效率,......
  • IC-Light:革新的AI光影魔术师,重塑图像的灵魂之光
    探索IC-Light:一款革命性的AI图像照明工具IC-Light,全称为“ImposingConsistentLight”,是一款由AI图像处理专家张吕敏(ControlNet的作者)精心开发的创新工具。主要用于控制图像光源效果,它利用先进的机器学习技术,为图像照明领域带来了前所未有的便利与创意空间。目前,发布了两种类......
  • Stable Diffusion - 光影魔法,SD中的光影控制(附模型)
    今天继续分享SD中光影控制的运用和效果。光影控制体验—这次介绍的光影控制效果如下:autumnlights:秋天光景,街景与人物服装也会变成秋装springlights:春天光景,街景与人物服装也会变成春装summerlights:夏天光景,街景与人物服装也会变成夏装winterlights:冬天光景,街......
  • 光影魔术手 v4.5.6.208 绿色便携版
    更新流水:2024.04.27:跟进官方4.5.6.208,第一版修改内容:by.星罗月兔&DxFans&haiyang457去校验(方案来自@星罗月兔),去更新,去多余组件及无用菜单;便携版集成新版启动器,简化了诸多文件存在,看起来更清爽;单文件版方案来自@haiyang457,特此感谢!下载地址:https://down.neoimaging......
  • Capture One 23:光影魔术师,细节掌控者mac/win版
    CaptureOne23,不仅仅是一款摄影后期处理软件,它更是摄影师们的得力助手和创意伙伴。这款软件凭借其卓越的性能、丰富的功能和前沿的技术,为摄影师们带来了前所未有的影像处理体验。→→↓↓载CaptureOne23mac/win版CaptureOne23以其强大的色彩管理和光影调整能力,让摄影师们......
  • [AH2017HNOI2017] 礼物(fft)
    [AH2017/HNOI2017]礼物(fft)题目描述我的室友最近喜欢上了一个可爱的小女生。马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她。每个手环上各有\(n\)个装饰物,并且每个装饰物都有一定的亮度。但是在她生日的前一天,我的室友突然发现他好像拿错了一个手环,而且......
  • HNOI2017影魔题解
    HNOI2017影魔对于两种贡献,都只用考虑左边第一个比自己大的,和右边第一个比自己大的数,分别记为\(l_i、r_i\)对于询问一,每个数对\((l_i,r_i)\)构成全部情况对于询问二,可以拆分成\(x=l_i\)时,\(y\in[i+1,r_i-1]\),以及\(y=r_i\)时,\(x\in[l_i+1,i-1]\)我们考虑用扫描线......
  • 影魔
    这一道题目有一个非常重要的思想,就是确定一个基准就像计数题目一样,我们将一个区间确定一个基准,我们一般不用端点作为基准,因为这是两个值,难以确定,我们的基准最好是一个值那么就不难确定一个区间\([a,b]\),以\((a,b)\)的最大值为基准所以我们对每一个数,求出它左边和右边距离他最近......
  • P3722 [AH2017/HNOI2017] 影魔
    题目链接Part1先想暴力,对于每次询问,可以直接\(\Theta(n^2)\)枚举数对,用\(ST\)表判断一下,复杂度为\(\Theta(qn^2)\)。发现枚举数对没有前途,考虑\((i,j)\)之间的最大值,发现一个数对产生的贡献只和区间的最大值有关,我们从这个最大值入手。我们把一个数对的贡献看做其区间最......
  • 洛谷 P3723 [AH2017/HNOI2017]礼物
    由题面可得:\[E_j=\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\frac{q_i}{(i-j)^2}\]令\(q_0=0\),并将没有意义的分式的值视为\(0\),则有:\[E_j=\sum_{i=0}^j\frac{q_i}{(i-j)^2}-\sum_{i=j}^n\frac{q_i}{(i-j)^2}\]令\(A(i)......