首页 > 其他分享 >CF819B Mister B and PR Shifts 题解

CF819B Mister B and PR Shifts 题解

时间:2024-07-20 19:40:18浏览次数:8  
标签:PR limits min 题解 sum Shifts add max ll

题目传送门

前置知识

权值树状数组及应用

解法

[ABC351F] Double Sum 的套路,尝试展开绝对值及 \(\min,\max\)。

将式子拆开有 \(\begin{aligned} & \min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}|a_{i}-(i+k)|+ \sum\limits_{i=n-k+1}^{n}|a_{i}-(i-(n-k))| \} \\ &=\min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}( \max(a_{i},i+k)- \min(a_{i},i+k))+ \sum\limits_{i=n-k+1}^{n}( \max(a_{i},i+k-n)- \min(a_{i},i+k-n)) \} \\ &=\min\limits_{k=0}^{n-1}\{ \sum\limits_{i=1}^{n-k}(a_{i}+i+k-2 \min(a_{i},i+k))+ \sum\limits_{i=n-k+1}^{n}(a_{i}+i+k-n-2 \min(a_{i},i+k-n)) \} \\ &=\sum\limits_{i=1}^{n}(a_{i}+i)+\min\limits_{k=0}^{n-1}\{- \sum\limits_{i=1}^{n-k}2 \min(a_{i},i+k)- \sum\limits_{i=n-k+1}^{n}2 \min(a_{i},i+k-n) \} \\ &=\sum\limits_{i=1}^{n}(a_{i}+i)-2 \max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k} \min(a_{i},i+k)+\sum\limits_{i=n-k+1}^{n} \min(a_{i},i+k-n) \} \end{aligned}\)。

  • 好像式子推多了,懒得改了,只是常数大点。

现在问题来到了怎么求 \(\max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k} \min(a_{i},i+k)+\sum\limits_{i=n-k+1}^{n} \min(a_{i},i+k-n) \}\)。

令 \(\begin{cases} x_{i}=a_{i}-i \\ y_{i}=a_{i}+n-i \end{cases}\),由于是排列所以 \(\{ x \},\{ y \}\) 均满足内部两两不同,则转化为求 \(\max\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k}([k \ge x_{i}] \times a_{i}+[k<x_{i}] \times (i+k))+\sum\limits_{i=n-k+1}^{n}([k \ge y_{i}] \times a_{i}+ [k<y_{i}] \times (i+k-n)) \}\),前半部分将其拆成 \(\begin{cases} [k \ge x_{i}] \times a_{i} \\ [k<x_{i}] \times i \\ [k<x_{i}] \times k \end{cases}\) 三部分,后半部分同理。

将 \(\{ x \},\{ y \}\) 分别插入到权值树状数组里,分别维护 \(\begin{cases} [k \ge x_{i}] \times a_{i}/[k \ge y_{i}] \times a_{i} \\ [k<x_{i}] \times i/[k<y_{i}] \times (i-n) \\ [k<x_{i}]/[k<y_{i}] \end{cases}\) 即可,注意及时消除影响。

对于负数整体向右移来处理。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
ll a[3000010],x[3000010],y[3000010],c[6][3000010];
ll lowbit(ll x)
{
    return (x&(-x));
}
void add(ll n,ll x,ll val,ll c[])
{
    x+=1000001;
    n+=1000001;
    for(ll i=x;i<=n;i+=lowbit(i))
    {
        c[i]+=val;
    }
}
ll ask(ll x,ll c[])
{
    ll ans=0;
    x+=1000001;
    for(ll i=x;i>=1;i-=lowbit(i))
    {
        ans+=c[i];
    }
    return ans;
}
int main()
{
    ll n,ans=0,pos=0,sum=0,i,k;
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        x[i]=a[i]-i;
        y[i]=a[i]+n-i;
        add(2*n,x[i],a[i],c[0]);
        add(2*n,x[i],i,c[2]);
        add(2*n,x[i],1,c[4]);  
    }
    for(k=0;k<=n-1;k++)
    {
        sum=0;
        sum+=ask(k,c[0]);
        sum+=ask(2*n,c[2])-ask(k,c[2]);
        sum+=(ask(2*n,c[4])-ask(k,c[4]))*k;
        sum+=ask(k,c[1]);
        sum+=ask(2*n,c[3])-ask(k,c[3]);
        sum+=(ask(2*n,c[5])-ask(k,c[5]))*k;
        if(sum>ans)
        {
            ans=sum;
            pos=k;
        }
        add(2*n,x[n-k],-a[n-k],c[0]);
        add(2*n,x[n-k],-(n-k),c[2]);
        add(2*n,x[n-k],-1,c[4]);
        add(2*n,y[n-k],a[n-k],c[1]);
        add(2*n,y[n-k],n-k-n,c[3]);
        add(2*n,y[n-k],1,c[5]);
    }
    ans*=-2;
    for(i=1;i<=n;i++)
    {
        ans+=a[i]+i;
    }
    printf("%lld %lld\n",ans,pos);
    return 0;
}

标签:PR,limits,min,题解,sum,Shifts,add,max,ll
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18313663

相关文章

  • 揭秘@Autowired:手把手教你复刻Spring依赖注入魔法
    文章目录手写一个@Autowired注解实现自动注入@Autowired注解的作用@Autowired的实现原理手写一个@MyAutowired注解定义@MyAutowired注解创建注解处理器集成自定义处理器总结@Autowired主要功能@Autowired实现原理手写@MyAutowired注解注意事项手写一个@Autowir......
  • SPREAD for Windows Forms 17.0J Crack
    はじめに日頃から格別のお引き立てを賜り、厚く御礼申しあげます。SPREADforWindowsForms17.0J(以下、本製品)は、エンドユーザーにとって親しみのあるMicrosoftExcel®と互換性の高い表計算機能をアプリケーションに提供するコンポーネントです。数式や条件付き書式、チ......
  • WebGoC题解(11) 627.传声(2019NHOI小乙)
    题目描述 小C节日旅游来到一个农场。农场主John和n个奶牛站在一条水平线上。牛的传递消息是依靠“吼”,牛的吼叫声最远可以传递的距离是50。农场主John首先通知最左边的第一条奶牛(一定会通知),然后奶牛就开始向后吼叫,后面的奶牛如果能听到(和前面吼叫的奶牛距离不超过50),就继续向......
  • 类明显存在却报 package not found, Java程序中专门被其他工程所依赖的common jar用sp
    先上官方链接:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/maven-plugin/examples/repackage-classifier.html在使用SpringBoot构建通用JAR库时,尤其是当通springboot默认的过spring-boot-maven-plugin插件打包时。如果遇到了类存在但报“packagenotfound......
  • 新产品,基于1200 V 碳化硅的功率模块NXH010P120M3F1PTG NVXK2PR80WXT2 NVXK2VR80WDT2(产
    1、NXH010P120M3F1PTG是一款功率模块,在F1封装中包含10mohm/1200VSiCMOSFET半桥和一个氧化铝(AL2O3)DBC热敏电阻。SiCMOSFET开关采用M3S技术,由18V-20V栅极驱动。规格:配置:Half-Bridge下降时间:15ns高度:12.35mmId-连续漏极电流:105A长度:63.3mm最大工作温度:+150°C......
  • SciTech-Theory-Phenomeon(Process and its Outcomes)->Experience(Sensation+Cogniti
    SciTech-Theory:Objective:Phenomeon:aobjectiveProcessanditsOutcomesSubjective:->Experience:Sensation+Cognition->Concept(Natural+Commonpartofexperiences)->Principle(research+invest)->Interpretations->Definition->Theo......
  • 解决 SpringBoot 应用中 MySQL 时区配置引起的时间不一致问题
    在开发SpringBoot项目时,表中有两个时间字段一个通过Java代码使用newDate()方法获取当前时间再插入数据库另一个是使用MySQL的CURRENT_TIMESTAMP作为默认值实际运行时发现数据库中的这两个时间值不一致,代码插入的时间比数据库自动生成的时间早了8小时,最终发现是y......
  • siebel server 启动时报Cleaning up previous execution of【转】
    恢复sibel某个环境整个SIEBELschema数据后,再启动sibelserver时,有时会hang死掉,也不生成任何日志,解决:这种情况往往需要reboot这台siebelserver所在的服务器,再启动siebelserver一般就能正常起来了。起来的提示信息中会多一句提示:cleaninguppreviousexecutionof.....,如下:[s......
  • Spring boot 与 json_schema ,请求和响应 校验
    java中如何使用json_schema对json进行校验在Java中使用JSONSchema对JSON进行校验,你首先需要选择一个合适的库。一个常用的库是json-schema-validator。以下是如何使用它的基本步骤:添加依赖如果你使用Maven,可以在pom.xml中添加以下依赖:<dependency><groupId>com.g......
  • springboot系列十: 自定义转换器,处理JSON,内容协商
    文章目录自定义转换器基本介绍应用实例查看源码注意事项和细节处理JSON需求说明应用实例内容协商基本介绍应用实例debug源码优先返回xml注意事项和细节⬅️上一篇:springboot系列九:接收参数相关注解......