首页 > 其他分享 >P8392 BalticOI 2022 Day1 Uplifting Excursion

P8392 BalticOI 2022 Day1 Uplifting Excursion

时间:2024-01-29 09:12:09浏览次数:31  
标签:Uplifting int ll long Day1 -- maxn 2022 贪心

P8392 BalticOI 2022 Day1 Uplifting Excursion

贪心加动规,好题,这两个甚至完全相反的东西可以融进一道题……

思路

物品较少,贡献较小,体积较小,但总体积巨大。

直接上 \(dp\) 容易把心态搞炸。

我们可以先考虑贪心,使贡献最多还剩 \(m\)。然后考虑背包填满剩下的体积,且 \(i\) 和 \(-i\) (这里的 \(-i\) 是撤销)的物品是不会重复出现在背包中的,如果重复出现了那么肯定不优,所以最多再加入 \(2m\) 个数,背包值域开 \([-m^2,m^2]\)。

为什么这里的贪心加 \(dp\)​ 是正确的呢?

  • 由于贡献相同,贪心选体积最小的物品肯定可以选择最多。

  • 我们在贪心之后进行了 \(dp\) 调整,这个调整是可以反悔减少物品的,也就是我们的 \(f[l]\) 会在体积满足 \(l\)​ 的情况下尽可能多的增加,尽可能少的减少物品,这也是和普通背包的区别。

那么最后我们得出的答案一方面保证了体积肯定符合规定,一方面保证了贪心和动规选出的或是减少的数都是最多或最少的。

实现

我们在一开始可以先加上所有负数状态,后面的正数状态加入时就相当于也选择了负数。

    scanf("%lld%lld",&n,&l);
    for(int i=n;i;i--) scanf("%lld",&a[i]),l+=a[i]*i,ans+=a[i];
    int t;
    scanf("%lld",&t);ans+=t;
    for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
    if(l<0){printf("impossible");return 0;}
    for(int i=1;i<=n;i++)
    {
        if(b[i]*i<=l) l-=b[i]*i,ans+=(b1[i]=b[i]);
        else {b1[i]=l/i;ans+=b1[i];l-=b1[i]*i;break;}
    }
    for(int i=n;i;i--)
    {
        if(a[i]*i<=l) l-=a[i]*i,ans-=(a1[i]=a[i]);
        else {a1[i]=l/i;ans-=a1[i];l-=a1[i]*i;break;}
    }

\(a1,b1\) 记录了选择了多少。

背包可以写成函数的形式并使用二进制优化。

void ins(ll s,ll v,ll w)//s ->数量,v ->体积,w ->贡献
{
    s=min(s,n*2+1);
    if(v>0)
    {
        int c=1;
        for(;c+c<s;c<<=1,v<<=1,w<<=1);
        while(1)
        {
            for(int i=k-v;i>=0;i--) f[i+v]=max(f[i+v],f[i]+w);
            s-=c;
            if(c==1) break;
            c>>=1,v>>=1,w>>=1;
        }
        if(s>0)
        {
            v*=s,w*=s;
            for(int i=k-v;i>=0;i--) f[i+v]=max(f[i+v],f[i]+w);
        }
    }
    else
    {
        v=-v;
        int c=1;
        for(;c+c<s;c<<=1,v<<=1,w<<=1);
        while(1)
        {
            for(int i=v;i<=k;i++) f[i-v]=max(f[i-v],f[i]+w);
            s-=c;
            if(c==1) break;
            c>>=1,v>>=1,w>>=1;
        }
        if(s>0)
        {
            v*=s,w*=s;
            for(int i=v;i<=k;i++) f[i-v]=max(f[i-v],f[i]+w);
        }
    }
}

CODE

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define int long long

const int maxn=505;

ll l,n,m,k,ans;
ll a[maxn],b[maxn],a1[maxn],b1[maxn];
ll f[maxn*maxn*2];

void ins(ll s,ll v,ll w)
{
    s=min(s,n*2+1);
    if(v>0)
    {
        int c=1;
        for(;c+c<s;c<<=1,v<<=1,w<<=1);
        while(1)
        {
            for(int i=k-v;i>=0;i--) f[i+v]=max(f[i+v],f[i]+w);
            s-=c;
            if(c==1) break;
            c>>=1,v>>=1,w>>=1;
        }
        if(s>0)
        {
            v*=s,w*=s;
            for(int i=k-v;i>=0;i--) f[i+v]=max(f[i+v],f[i]+w);
        }
    }
    else
    {
        v=-v;
        int c=1;
        for(;c+c<s;c<<=1,v<<=1,w<<=1);
        while(1)
        {
            for(int i=v;i<=k;i++) f[i-v]=max(f[i-v],f[i]+w);
            s-=c;
            if(c==1) break;
            c>>=1,v>>=1,w>>=1;
        }
        if(s>0)
        {
            v*=s,w*=s;
            for(int i=v;i<=k;i++) f[i-v]=max(f[i-v],f[i]+w);
        }
    }
}

signed main()
{
    scanf("%lld%lld",&n,&l);
    for(int i=n;i;i--) scanf("%lld",&a[i]),l+=a[i]*i,ans+=a[i];
    int t;
    scanf("%lld",&t);ans+=t;
    for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
    if(l<0){printf("impossible");return 0;}
    for(int i=1;i<=n;i++)
    {
        if(b[i]*i<=l) l-=b[i]*i,ans+=(b1[i]=b[i]);
        else {b1[i]=l/i;ans+=b1[i];l-=b1[i]*i;break;}
    }
    for(int i=n;i;i--)
    {
        if(a[i]*i<=l) l-=a[i]*i,ans-=(a1[i]=a[i]);
        else {a1[i]=l/i;ans-=a1[i];l-=a1[i]*i;break;}
    }
    m=n*n,k=m*2;
    memset(f,0xcf,sizeof(f));
    f[m]=0;
    for(int i=1;i<=n;i++)
    {
        if(b1[i]) ins(b1[i],-i,-1);
        if(b[i]-b1[i]) ins(b[i]-b1[i],i,1);
        if(a1[i]) ins(a1[i],-i,1);
        if(a[i]-a1[i]) ins(a[i]-a1[i],i,-1);
    }
    if(l>m||f[m+l]<-m){printf("impossible");return 0;}
    else printf("%lld",ans+f[m+l]);
}

记得全开 long long

标签:Uplifting,int,ll,long,Day1,--,maxn,2022,贪心
From: https://www.cnblogs.com/binbinbjl/p/17993777

相关文章

  • Java学习日记 Day14
    算法:①二叉搜索树的最近祖先:我用了二叉树最近祖先的同样的方法,没有考虑二叉树的定义。还是先判断当前节点情况,然后做递归调用,判断左右节点的情况。②二叉搜索树添加节点:这个要明白添加的节点一定在最后,所以只要判断节点数值大小,一直递归调用就好。③二叉搜索树删除节点:删除分几......
  • BEVFusion: 基于统一BEV表征的多任务多传感器融合(MIT 2022)
     arXiv上传于2022年5月26日论文“BEVFusion:Multi-TaskMulti-SensorFusionwithUnifiedBird’s-EyeViewRepresentation“,来自MIT韩松团队的工作报告。代码将开源https://github.com/mit-han-lab/bevfusion  前不久介绍过一篇BEV多传感器融合的目标检测工作:“FUT......
  • 2021-2022 ICPC Southwestern European Regional Contest (SWERC 2021-2022)
    Preface这场打的也挺好的,前中期稳定出题,后期还和徐神接力写了一个K最后乱猜还猜对了H题的结论,可惜因为常数以及三分的bound等问题赛事没过最后10题舒服下班A.OrganizingSWERC签到,话说外国场的A基本都是签到啊#include<cstdio>#include<iostream>#defineRIregisterin......
  • 【专题】2022中国工业机器人市场研究报告PDF合集分享(附原数据表)
    报告链接:https://tecdat.cn/?p=33224本报告合集将基于中国工业产业升级和智能制造的背景,通过对供应端市场和产业链的分析,结合投资视角,探讨工业机器人企业如何增强自身竞争力,推动中国工业产业发展,为企业带来新的增长和转型机会,并从而思考中国工业机器人行业的现状和未来趋势。阅读......
  • Java学习日记 Day13 好像要摆烂几天
    算法:二叉搜索树的公共祖先:今天就做了一道题,因为要自底向上的查找,所以很像回溯。先递归遍历到最下面的节点,如果当前节点是要找的节点就返回,返回后设置判断条件,判断两个目标节点在同一侧还是在两侧。SpringMVC:后面的异常处理和文件上传没看,看了SSM的整合,基本靠配置文件和注解极大......
  • Java学习日记 Day12 心累~
    SpringMVC:主要学了SpringMVC架构下请求与响应的各种方式,在响应中要知道请求转发和重定向的区别。算法:合并二叉树:判断当前节点两棵树的数值关系,然后递归判断左右子树的关系。二叉搜索树中的搜索:根据二叉搜索树的特点,递归查找左右子树,当值相等就返回。验证二叉搜索树:为自己的左......
  • [西湖论剑 2022]web部分题解(更新中ing
    [西湖论剑2022]NodeMagicalLogin环境!启动!(ノへ ̄、)这么一看好像弱口令啊,(不过西湖论剑题目怎么会这么简单,当时真的傻),那就bp抓包试一下(这里就不展示了,因为是展示自己思路,这里就写了一下当时的NC思路,其实是不对的┭┮﹏┭┮)不是BP弱口令?那好吧,我们先看一下源码,比赛的时候是给了源......
  • 每日一练 | 华为认证真题练习Day172
    1、关于OSPF的ASBR-SUMMARY-LSA中LSA头部他、信息描述错误的是A.LINKSTATEID表示ASBR的ROUTERIDB.ADVERTISINGROUTER表示该ABR的ROUTERIDC.ADVERTISINGROUTER字段永远不会改变D.METRIC表示该ABR到达ASBR的OSPF开销2、关于OSPF外部路由种类描述错误的是A.OSPF分为第一类......
  • P9805 [POI2022~2023R1] ply
    1st思路贪心当遇到左括号深度加一,可如果当前深度大于$H$时深度减二,并且$ans$加一。相当于进行一次翻转操作。当遇到右括号深度减一,当深度小于零时深度加二,并且$ans$加一。code#include<bits/stdc++.h>usingnamespacestd;strings;intk,n=0,m=0,ans=0;intmain......
  • 春秋云境CVE-2022-30887
    一进来看到一个登录页面,随便找个字典进行爆破,结果发现不行 没有头绪去看了会wp。点击页面底部的MayuriK,翻到页面最底部,随便点一个 会弹出邮箱号 密码为mayurik,也许是名字?  在addmedicine中发现可以上传文件的地方,尝试上传一句话木马 上传成功 找到木......