【BZOJ 4069】 [Apio2015]巴厘岛的雕塑

2023-10-29

4069:[apio2015]巴厘岛的雕塑

Time limit: 1000 ms

Memory limit: 65536 KB

Description

The province of Bali has many sculptures located on its roads. Let’s focus on one of its main roads.

There are N sculptures on that main road, conveniently numbered 1 through N consecutively. The age of sculpture i is Yi years. To make the road more beautiful, the government wants to partition the sculptures into several groups. Then, the government will plant beautiful trees between the groups, to attract more tourists to Bali.

Here is the rule in partitioning the sculptures:

The sculptures must be partitioned into exactly X groups, where A ≤ X ≤ B. Each group must consist of at least one sculpture. Each sculpture must belong to exactly one group. The sculptures in each group must be consecutive sculptures on the road.
For each group, compute the sum of the ages of the sculptures in that group.
Finally, compute the bitwise OR of the above sums. Let’s call this the final beauty value of the partition.
What is the minimum final beauty value that the government can achieve?

Note: the bitwise OR of two non-negative integers P and Q is computed as follows:

Convert P and Q into binary.
Let nP = number of bits of P, and nQ = number of bits of Q. Let M = max(nP, nQ).
Represent P in binary as pM-1pM-2 .. p1p0 and Q in binary as qM-1qM-2 .. q1q0, where pi and qi are the i-th bits of p and q, respectively. The (M-1)st bits are the most significant bits, while the 0th bits are the least significant bits.
P OR Q, in binary, is defined as (pM-1 OR qM-1)(pM-2 OR qM-2)..(p1 OR q1)(p0 OR q0), where
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
Input Format

The first line contains three space-separated integers N, A, and B. The second line contains N space-separated integers Y1, Y2, …, YN.

Output Format

A single line containing the minimum final beauty value.

Sample Input

6 1 3
8 1 2 1 5 4
Sample Output

11
Explanation

Partition the sculptures into 2 groups: (8 1 2) and (1 5 4). The sums are (11) and (10). The final beauty value is (11 OR 10) = 11.

Subtasks

Subtask 1 (9 points)

1 ≤ N ≤ 20
1 ≤ A ≤ B ≤ N
0 ≤ Yi ≤ 1,000,000,000
Subtask 2 (16 points)

1 ≤ N ≤ 50
1 ≤ A ≤ B ≤ min(20, N)
0 ≤ Yi ≤ 10
Subtask 3 (21 points)

1 ≤ N ≤ 100
A = 1
1 ≤ B ≤ N
0 ≤ Yi ≤ 20
Subtask 4 (25 points)

1 ≤ N ≤ 100
1 ≤ A ≤ B ≤ N
0 ≤ Yi ≤ 1,000,000,000
Subtask 5 (29 points)

1 ≤ N ≤ 2,000
A = 1
1 ≤ B ≤ N
0 ≤ Yi ≤ 1,000,000,000

贪心+dp。

从最高位开始枚举,能是1就是1,如何判断当前这一位(第 k 位)能否是1呢?

用dp来做!

f[i][j]表示前 i 个数分成j位满足之前 k1 位的答案(答案中是0的位任何一段不能是1)且第 k 位是1。

dp完后判断一下f[n][j],j[A,B]中有没有为 true 的即可。

但是这样做复杂度是 O(logMn3) ,过不了subtask5。

注意到这组数据中 A=1 ,是没有下限的,只要把dp函数变成 g[i] 表示前 i 个数符合条件至少要分几组,判断g[n]是否 B 即可。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
LL a[2005];
int n,A,B,f[105][105],g[2005];
int ok(LL x,LL y)
{
    return (x|y)==y;
}
int Log(LL x)
{
    int ans=0;
    LL b=1;
    while (b<x)
    {
        b<<=1LL;
        ans++;
    }
    return ans;
}
void Clear()
{
    for (int i=1;i<=n;i++)
        for (int j=1;j<=i;j++)
            f[i][j]=0;
}
void Work1()
{
    LL ans=0;
    for (int now=Log(a[n]);now;now--)
    {
        for (int i=1;i<=n;i++)
            g[i]=inf;
        g[0]=0;
        for (int i=1;i<=n;i++)
            for (int j=0;j<i;j++)
            {
                LL x=a[i]-a[j];
                if (x&(1LL<<(now-1))) continue;
                if (ok(x>>now,ans))
                    g[i]=min(g[i],g[j]+1);
            }
        ans<<=1LL;
        if (g[n]>B) ans|=1;
    }
    cout<<ans<<endl;
}
void Work2()
{
    LL ans=0;
    int tot=Log(a[n]);
    for (int now=tot;now;now--)
    {
        Clear();
        f[0][0]=1;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=i;j++)
                for (int k=0;k<i;k++)
                    if (f[k][j-1])
                    {
                        LL x=a[i]-a[k];
                        if (x&(1LL<<(now-1))) continue;
                        if (ok(x>>now,ans))
                            f[i][j]=1;
                    }
        int t=0;
        for (int i=A;i<=B;i++)
            t|=f[n][i];
        ans<<=1LL;
        if (!t) ans|=1;
    }
    cout<<ans<<endl;
}
int main()
{
    //freopen("t.in","r",stdin);freopen("t.out","w",stdout);
    scanf("%d%d%d",&n,&A,&B);
    for (int i=1;i<=n;i++)
        scanf("%I64d",&a[i]),a[i]=a[i]+a[i-1];
    if (A==1) Work1();
    else Work2();
    return 0;
}

这里写图片描述

这是一道对dp灵活应用的好题啊。

对于前四个subtask的dp方程其实是递推,无法直接判断前 n 位是否可行,我们就从第1位开始判断,因为满足后面的前提是要满足前面的。

第五个subtask没有了下限A,变成了最优性问题,就可以dp来做了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【BZOJ 4069】 [Apio2015]巴厘岛的雕塑 的相关文章

  • [NOI2010]超级钢琴【RMQ+贪心+堆】

    题目链接 超级棒的一道题 解这道题 需要分一下几步来看 取的是连续段 我们可以对每个可能起点去知道它的最大可能解 起点begin 最大可行解一定是begin L 1 begin R 1中的一个 如果每次都是取最大的话 那么下一个同起点的一定
  • HYSBZ bzoj 1941 Hide and Seek

    Problem www lydsy com JudgeOnline problem php id 1941 vjudge net contest 187908 problem B Reference BZOJ1941 Sdoi2010 Hi
  • 某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:

    某企业每月给其A B C 和D 四个门店一共发送6 个集装箱的某种货物 如果各门店出售该种货物的利润 万元 如下表 试求这6 箱货物如何分配给各门店 才能获得最大总利润 解题思路 将问题按卖场分为四个阶段 将A B C D四个卖场分别编号为
  • codeforces Gym 101341 K Competitions

    Problem codeforces com gym 101341 problem K vjudge net contest 162325 problem K Meaning 有 n 场比赛 每一场有 开始时间 a 结束时间 b 价值 c
  • [NOI Online #3 入门组 T3]买表【二进制优化dp背包】

    题目链接 很可惜的一点就是 我正赛的时候好像把a和k看反了 于是一直想不到如何做 打了个暴力分 现在想想 暴力分也错了 因为a和k真的很关键 使得最后300变成200分 人生第一场OI就这样草草结束 或许这就是OI选手的刺激所在吧 得亏我不
  • dp(动态规划)思考

    dp的核心思想是分治策略和表存储 分治策略并非dp所独有 很多算法都运用了把问题拆解为子问题的做法 比如递归 表存储应该是dp比较独有的一种方式 通过存储一些中间结果 可以避免重复计算 从而提升程序运行的速度 def max length
  • 【BZOJ3309】DZY Loves Math(莫比乌斯反演)

    题面 求 i 1a j 1bf gcd a b sum i 1 a sum j 1 bf gcd a b 其中 f x f x 表示 x x分解质因数之后 最高的幂次 题解 完全不会莫比乌斯反演了 先来推式子 d 1a i 1a d j 1
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • Educational Codeforces Round 67 (Rated for Div. 2)

    contest链接 A Stickers and Toys time limit per test 2 seconds memory limit per test 256 megabytes input standard input out
  • Economic Difficulties【DP】【Codeforces 1263 F】

    Codeforces Round 603 Div 2 F 题意 给你两棵树 结点分别是1 A与1 B 然后给了N台设备 并且A树和B树的叶子结点都是链接设备的 问的是 我们最多可以割几条边使得每个设备都能链接A树或者B树上任意的一个 1 号
  • Codeforces 1469 F. Power Sockets —— 二分+线段树,贪心

    This way 题意 现在有一个根节点 和n条包含a i 个节点的链 一开始所有点的颜色是白色的 你每次可以做以下操作 找到树中某个白色节点 拿出一条链 将这个节点和链上某个节点连接 并且这两个点的颜色变成黑色 之后这条链属于树中一个部分
  • GYM 102059 G Fascination Street

    G Fascination Street 参考 给出一串n 2e5 个灯 每个灯点亮可以照到相邻三个位置 每个灯点亮都有不同的花费 现在可以交换k 9 次灯的位置 求把所有n个位置都照到的最小花费 交换的肯定是一个亮的灯和一个灭的灯 不然是
  • +-字符串(简单贪心)

    字符串 时间限制 1000 ms 内存限制 65535 KB 难度 1 描述 Shiva得到了两个只有加号和减号的字符串 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个
  • 动态规划问题——最长上升子序列(LIS)(一)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 二 动态规划问题 最长上升子序列 LIS 三 如 求 2 7 1 5 6 4 3 8 9 的最长上升子序列 我们定义d i i 1 n 来表示前i个数以A
  • AcWing 1247. 后缀表达式

    老师的讲课网址 https www acwing com video 736 第二个图就已经告诉我们只要有一个减号 我们就可以组成至少含一个减号的所有组合 比如说一个减号三个加号我们可以组合成 1 2 3 4 所以代码如下 include
  • 递归、加法原理,如何分解问题(独立且完备的划分)

    加法原理适用于做一件事有n种独立不相交且完备的方向 每个方向上有ai种方案 则总的方案数就是 a1 a2 an 例题 把n个数分为k个非空子集 有多少种分法 分解问题 第一个集合里放多少个数把原问题的解分成了独立且完备的若干方向 分别解每个
  • BZOJ3425 Poi2013 Polarization

    最小值一定是n 1 每条边贡献一个答案 显然 首先我们要证明这道题的一个性质 最优解一定具有如下形式 以树的某一个重心 可以是任意一个 为根 根的每一个子树里的所有边要么都指向根 要么都指向叶子 引理 首先对于一棵树 我们把所有边的朝向反转
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

    题目 n n lt 500 种球 第i种有ai 0 lt ai lt 1e12 个球 m m lt 5e5 个盒子 第j个能放bj 0 lt bj lt 1e12 个球 特别地 第j个盒子最多能放i j个第i种球 求m个盒子能放的最多的球的

随机推荐

  • PhalApi+Gearman,接口MQ异步队列任务的完整开发教程

    MQ异步队列 在API接口同步请求过程中 不适合处理耗时过长 或者一直轮询的工作 此时 可以结合MQ异步队列任务进行后台处理 MQ异步队列服务 Gearman 关于异步队列服务有很多种 这里PhalApi选择使用了Gearman 它的特点是
  • js判断数组中重复元素并找出_JavaScript检查数据中是否存在相同的元素(两种方法)...

    这里是两个用于数组中查找重复元素的demo 可以看看啦Title 获取 方法一 var arr1 11 22 33 44 var arr new Array arr1 Array prototype in array function e
  • 分治法

    简介 对于一个规模为n的问题 若该问题可以容易地解决 比如说规模n较小 则直接解决 否则将其分解为k个规模较小的子问题 这些子问题互相独立且与原问题形式相同 递归地解这些子问题 然后将各子问题的解合并得到原问题的解 这种算法设计策略叫做分治
  • nginx访问静态文件不下载

    1 什么是MIME TYPE MIME Multipurpose Internet Mail Extension 多用途因特网邮件扩展 最初是为了满足电子邮件支持多字符集及附件而出现的 MIME Type 不是个人指定的 是经过 ietf
  • oracle exec报错,VNCSERVER 重启后突然报错:ExecStart=usrbinvncserver_wrapper oracle %i (code=exited, status=2)...

    VNCSERVER 重启后突然报错 ExecStart usr bin vncserver wrapper oracle i code exited status 2 root ykt systemctl restart vncserver
  • 深入学习jquery源码之map()

    概述 将一组元素转换成其他数组 不论是否是元素数组 你可以用这个函数来建立一个列表 不论是值 属性还是CSS样式 或者其他特别形式 这都可以用 map 来方便的建立 参数 callback 给每个元素执行的函数 把form中的每个input
  • C++累加求和 (阶乘)

    include
  • open3d学习教程2--点云1

    目录 1 open3d介绍 2 点云 2 1 读取 可视化点云 2 2点云体素下采样 2 3点法线估计 2 4点云着色 1 open3d介绍 接着上一节点云pointcloud open3d是一个开源库 支持快速处理3d数据 比如点云 体素
  • Mysql文件导出数据库,以及Linux中导入数据库

    1 导出命令mysqldump u root p test gt test sql 2 上传到linux服务器上 3 导入数据库文件 4 进入linux中的mysql 5 创建数据库ssm 6 source sql文件的路径名称 7 打包s
  • 最小二乘法构建线性回归方程

    目录 一 相关数学知识的定义 1 1 一元线性回归的定义 1 2 相关系数R 的定义 二 使用jupyter来做一元线性回归分析 2 1 根据最小二乘法公式手动构建一元线性回归模型 2 2 调用包实现一元线性回归模型 三 用excel进行一
  • Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three js实例详解 旋转的精灵女孩 附完整代码和资源 一 本文目录 一 旋转的精灵女孩 案例运行效果 二 Three js简介 三 Three js代码正常运行显示条件 1 不载入任何纹理贴图的网页 2 从外部文件里载入几何体或是纹理
  • 五、java代码实现快速排序

    快速排序思路 每一轮排序选择一个基准点进行分区 让小于基准点的元素进入一个分区 大于基准点的元素进入另一个分区 当分区完成时 基准点元素的位置就是其最终的位置 在子分区内重复以上过程 直至子分区元素个数少于等于1 分治算法 代码实现 单边循
  • Redis常用value命令

    本文是根据B站大学动力节点课程总结而来 原视频请移步至Redis7 033 ZSet型value操作命令 2 哔哩哔哩 bilibili PS 其中的某个视频音画不同步 redis中的value类型有五种 分别是String 字符串类型 H
  • LC-3汇编语言求成绩等级

    题目描述 背景 16名学生成绩排序 及统计分析 成绩分类规则 A 全班排名前25 且成绩在85分及以上 B 非A成绩 全班排名前50 且成绩在75分及以上 C 非A B成绩 要求 使用LC 3汇编语言 编写程序实现以上功能 输入 16名学生
  • C#面向对象编程

    面向对象 C 不是一种纯粹的面向对象编程语言 它提供了多种编程范式 但是 面向对象是C 的一个重要概念 也是 NET 提供的所有库的核心原则 面向对象的三个最重要的概念是继承 封装和多态性 本章将介绍如何使用继承增强基类型 如何创建类层次
  • kafka应用问题

    1 问题一 Connection to node 2 could not be established Broker may not be available 解决办法 1 检查防火墙是否开放相关端口 2 如果是部署在云服务器 检查云服务器
  • C++ 拷贝(复制)构造函数

    拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象 比如之前学习过的string类 string s1 string s2 s1 一般情况下的拷贝构造函数 class A private int n double d char s p
  • 小梅哥Xilinx FPGA学习笔记6——参数化设计及模块重用设计流水灯(跑马灯)

    参数化设计及模块重用设计流水灯 功能介绍 1 功能描述 一 代码编写 1 设计文件 2 激励文件 3 仿真图 二 总结 功能介绍 1 功能描述 8个Led灯以0 5s的的速率循环闪烁 参数化设计并且调用三八译码器模块完成该设计 三八译码器模
  • TCP/IP详解 卷1:协议 学习笔记 第六章 ICMP:Internet控制报文协议

    ICMP是IP层的组成部分 用来传递差错报文和其他需要注意的信息 它通常被更高层的协议 TCP UDP 使用 一些ICMP报文把差错返回给用户进程 类型字段可以有15个不同值 用来描述ICMP报文的类型 某些ICMP还使用代码字段的值进一步
  • 【BZOJ 4069】 [Apio2015]巴厘岛的雕塑

    4069 apio2015 巴厘岛的雕塑 Time limit 1000 ms Memory limit 65536 KB Description The province of Bali has many sculptures locat