首页 > 其他分享 >解题报告P2048 [NOI2010] 超级钢琴

解题报告P2048 [NOI2010] 超级钢琴

时间:2023-10-08 21:26:36浏览次数:36  
标签:10 解题 read zc ch num NOI2010 端点 P2048

P2048 [NOI2010] 超级钢琴

题目链接
RMQ好题,但是不知道为啥hzoi放到了lca的题单

这道题思路想了一半然后卡了,不知道怎么处理重复贡献的问题。
然后he了眼题解,茅塞顿开。可以再次将最优分成两个,再次计算。
全程维护音符的前缀和,和区间最大值。
结构体内存最大值,左端点,右端点范围,以及右端点。
考虑先枚举左端点 \(i\) 到右端点 \(i+L-1\) 到 \(i+R-1\) ,找出最大值。
然后将它压入优先队列。
枚举完之后,取出队头,将队头分成两部分(如果能的话),算出这两个区间的最大值后再压入队列。
这样取出 \(k\) 次后,就是乐曲美妙度最大值。
代码

/*
 * @Author: Ishar-zdl 
 * @Date: 2023-10-02 09:54:48 
 * @Last Modified by: Ishar-zdl
 * @Last Modified time: 2023-10-02 16:10:20
 */
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
    return x*f;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
struct Skadi{
    int o,l,r,x,t;bool operator<(Skadi b)const{return x<b.x;}
};
const int N=5e5+10;
int n,k,L,R,A[N],a[N],st[N][20],num[N][20];
priority_queue<Skadi> q;
inline void in(){
    n=read(),k=read(),L=read(),R=read();
    for(int i=1;i<=n;i++)A[i]=read(),a[i]=A[i]+a[i-1],st[i][0]=a[i],num[i][0]=i;
}
inline void stt(){
    for(int i=1;i<=20;++i)
        for(int j=1;j+(1<<i)-1<=n;++j)
            if(st[j][i-1]>st[j+(1<<(i-1))][i-1])num[j][i]=num[j][i-1],st[j][i]=st[j][i-1];
            else num[j][i]=num[j+(1<<(i-1))][i-1],st[j][i]=st[j+(1<<(i-1))][i-1];
}
inline void work(){
    Skadi zc;
    for(int i=1;i+L-1<=n;++i){
        zc.o=i,zc.l=i+L-1,zc.r=min(i+R-1,n);
        int k=__lg(zc.r-zc.l+1);
        int A=st[zc.l][k],B=st[zc.r-(1<<k)+1][k];
        if(A>B)zc.x=A-a[i-1],zc.t=num[zc.l][k];
        else zc.x=B-a[i-1],zc.t=num[zc.r-(1<<k)+1][k];
        q.push(zc);
    }long long tot=0,ans=0;
    while(tot<k){
        zc=q.top(),q.pop(),ans+=zc.x;tot++;
        if(zc.t!=zc.l){
            int k=__lg(zc.t-zc.l);int A=st[zc.l][k],B=st[zc.t-(1<<k)][k];int x,t;
            if(A>B)x=A-a[zc.o-1],t=num[zc.l][k];
            else x=B-a[zc.o-1],t=num[zc.t-(1<<k)][k];
            q.push({zc.o,zc.l,zc.t-1,x,t});
        }
        if(zc.t!=zc.r){
            int k=__lg(zc.r-zc.t);int A=st[zc.t+1][k],B=st[zc.r-(1<<k)+1][k];int x,t;
            if(A>B)x=A-a[zc.o-1],t=num[zc.t+1][k];
            else x=B-a[zc.o-1],t=num[zc.r-(1<<k)+1][k];
            q.push({zc.o,zc.t+1,zc.r,x,t});
        }
    }
    write(ans);
}
int main(){
    in();
    stt();
    work();
    return 0;
}

标签:10,解题,read,zc,ch,num,NOI2010,端点,P2048
From: https://www.cnblogs.com/Ishar-zdl/p/17750156.html

相关文章

  • 《CF gym Reverse LIS》解题报告
    原题链接一开始看到这题就很像模拟费用流,不过立马就放弃了,然后之后就再也没想过这个思路了。。。正解是模拟费用流,先讲一下答案长什么样,把\(0\)的权值记为\(1\),\(1\)的权值记为\(-1\),那么我们答案就是要选一段前缀和\(k\)段不相交的区间的最大值加上\(1\)的个数。......
  • 《CF1824E LuoTianyi and Cartridge》 解题报告
    好题。模拟赛出了这题,抽象。初步化简:由于\(\min(A,C)\)不好处理,我们考虑从大到小加边加点,或者从小到大删边删点。一般题目是考虑加边加点好操作一点,这题是考虑删边删点好操作。然后我们记当前枚举的\(\min(A,C)\)的最小值是多少,记为\(x\)。然后称大于等于\(x\)点权......
  • 《从0到1的CTF成长之路》1.1.2 粗心的小李 解题过程
    解题试试书里教的工具scrabblegitclonehttps://github.com/denny0223/scrabble.git./scrabble127.0.0.1得到结果:找到Flag:n1book{git_looks_s0_easyfun}......
  • P3477 [POI2008] PER-Permutation 解题报告
    我咕咕咕了这道题半年之久?好像洛谷好多题解都被hack了啊,但是没有被撤。(本题解现有hack均通过)题目链接折叠题干[POI2008]PER-Permutation题目描述Multisetisamathematicalobjectsimilartoaset,buteachmemberofamultisetmayhavemorethanonemem......
  • 《AT_abc322_g Two Kinds of Base》解题报告
    好题,考场上想到做法了,没写出来,被薄纱了,记录一下。主要是做的比较顺一下就想到了。我们先转换一下\(f\)函数\(f(S,a,b)=\sum\limits_{i=1}^kS_i\times(a^{k-i}-b^{k-i})\)我们可以发现对于位数\(>2\)的,一定满足\(a\le\frac{(x+1)}2\),因为如果不是的话\(a^2-(a-1)^2=......
  • 解题报告 洛谷P2155 [SDOI2008] 沙拉公主的困惑
    P2155[SDOI2008]沙拉公主的困惑题目题面非常的简洁,求\(\sum\limits_{i=1}^{n!}[i\perpm!]\)直接颓式子,\[\begin{aligned}ans&=\dfrac{n!}{m!}\cdot\varphi(m!)\\\\&=\dfrac{n!}{m!}*m!\prod\limits_{p\midm!}[\dfrac{p-1}{p}]\\&=n!\cdot\dfrac{\......
  • 解题报告 P2680 [NOIP2015 提高组] 运输计划
    P2680[NOIP2015提高组]运输计划题目链接LCA的题,需要求最大值最小,考虑二分答案。先存储每组询问的距离。然后二分答案时找出所有比当前答案长的距离的重叠部分。在这些重叠部分中找出权值最大的边。判断最长链减去这条边是否小于等于当前答案。否则返回0代码如下/**@......
  • 「解题报告」The 1st Universal Cup. Stage 3: Poland
    大概按难度排序。签到题没写。QOJM.MinorEvil有\(n\)个球与\(k\)个操作,初始所有球都是白色的。第\(i\)个操作为如果\(a_i\)是白色的,那么就将\(b_i\)染成黑色,否则什么都不做。你可以选择每个操作执行或不执行,但是不能改变操作之间的相对顺序。现在你有一个球的集合......
  • 《AT_abc310_h Negative Cost》 解题报告
    神仙题看到没人交题解,我来交一发。\(Part\0:\)我瞎扯扯我做这题时想着先把耗费魔法值为负的做掉,然后最后再做一段魔法值为正的,但是不好做,做不了。这个东西也贪心不了,因为你魔法值和伤害这两个东西拆不开,然后就什么都做不了了。本篇题解中没有什么心路历程,又不能分析出什么动......
  • CF986F 解题报告
    显然要关于\(k\)离线。对于固定的\(k\),关于\(k\)的质因子的个数讨论:如果\(k\)是形如\(p^\alpha\)的素数幂只需判断\(p|n\)即可。否则我们可以跑类似同余最短路。当\(\minp_i\)很大的时候,过不去。但是,极限数据只能在形如\(k=p_1^{\alpha_1}p_2^{\alpha_2......