[APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
[APIO2015]巴厘岛的雕塑
题目描述
印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道。
在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行标号,其中第\(i\)座雕塑的年龄是\(Y_{i}\)年。
为了使这条路的环境更加优美,政府想把这些雕塑分成若干组,并通过在组与组之间种上一些树,来吸引更多的游客来巴厘岛。
下面是将雕塑分组的规则:
这些雕塑必须被分为恰好\(X\)组,其中 \(A<=X<=B\),每组必须含有至少一个雕塑,每个雕塑也必须属于且只属于一个组。
同一组中的所有雕塑必须位于这条路的连续一段上。
当雕塑被分好组后,对于每个组,我们首先计算出该组所有雕塑的年龄和。
计算所有年龄和按位取或的结果。我们这个值把称为这一分组的最终优美度。
请问政府能得到的最小的最终优美度是多少?
数据范围:

或值最大 ---) 按位贪心即可
为了保证最小,从高位向低位贪心(虽然最大是一样的。。。)
那么怎么确定最小的答案呢?
注意到,高位贪心的结果需要被保留(高位一定更优)。
因此,维护\(dp(i,j)\)表示枚举到第\(i\)位,分成了\(j\)块,能否在满足高位贪心的同时可不可以让当前位为0。
如果\(dp(n,A)...dp(n,B)\)中有一个满足,那么当前位可以为0,计入高位。
如何转移?
枚举即可,枚举所有的区间来转移,确定一位能否为0需要\(n^{2}*B\)时间
总共需要时间\(O(\log n *B*n^{2})\)
可以发现过不掉最后一个点。
但是\(A=1\)非常的显眼,有什么用?
这告诉我们没有下届,只有上届。
因此,只要求出至少需要多少块才能在满足高位贪心的同时让当前位为0,同样可以判断。
复杂度可以降至:
\(O(\log n * n ^{2})\)
#include <cstdio>
#include <cstring>
#define ll long long
#define ri register int
using namespace std; char RR[], *S = RR, *T = RR + ;
inline char gc() {
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') {
if(c == '-') w = -;
c = gc();
}
while(c >= '' && c <= '') {
p = p * + c - '';
c = gc();
}
return p;
} template <typename re>
inline void upmin(re &a, re b) { if(a > b) a = b; } int n, A, B;
ll ans, sum[], bit[];
bool dp[][];
int f[]; void Solve1() {
for(ri p = ; p; p --) {
memset(dp, , sizeof(dp));
dp[][] = ;
for(ri i = ; i <= n; i ++)
for(ri j = ; j <= i; j ++)
for(ri k = j - ; k <= i - ; k ++)
if(dp[k][j - ]) {
ll pp = sum[i] - sum[k];
if(((pp >> p) | ans) == ans)
if((pp & bit[p - ]) == ) dp[i][j] = ;
}
ans <<= ; ans |= ;
for(ri i = A; i <= B; i ++)
if(dp[n][i]) { ans ^= ; break; }
}
printf("%lld\n", ans);
} void Solve2() {
for(ri p = ; p; p --) {
for(ri i = ; i <= n; i ++) f[i] = ;
for(ri i = ; i <= n; i ++)
for(ri j = ; j <= i - ; j ++) {
ll pp = sum[i] - sum[j];
if(((pp >> p) | ans) == ans)
if((pp & bit[p - ]) == ) upmin(f[i], f[j] + );
}
ans <<= ;
if(f[n] > B) ans |= ;
}
printf("%lld\n", ans);
} int main() {
for(ri i = ; i <= ; i ++) bit[i] = 1LL << i;
n = read(); A = read(); B = read();
for(ri i = ; i <= n; i ++) sum[i] = sum[i - ] + read();
if(A == ) Solve2();
else Solve1();
return ;
}
Aha!
[APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举的更多相关文章
- [APIO2015]巴厘岛的雕塑 贪心+DP+特殊数据优化
写了好久.... 刚刚调了一个小时各种对拍,,,,最后发现是多写了一个等号,,,,内心拒绝 表示一开始看真的是各种懵逼啊 在偷听到某位大佬说的从高位开始贪心后发现可做 首先考虑小数据(因为可以乱搞) ...
- BZOJ 4069 [Apio2015]巴厘岛的雕塑 ——贪心
自己首先想了一种方法$f(i)$表示前$i$个最小值为多少. 然而发现位运算并不满足局部最优性. 然后我们可以从高到低贪心的判断,使得每一组的和在一个特定的范围之内. 还要特判最后一个Subtask, ...
- 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
- bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
- bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...
- 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑, ...
- [APIO2015]巴厘岛的雕塑[按位贪心+dp]
题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...
- 4069: [Apio2015]巴厘岛的雕塑
Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 1 到 N 连续地进行标号,其中第 i 座雕塑的年龄 ...
- [APIO2015]巴厘岛的雕塑
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 Y ...
随机推荐
- iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2014年2月19日更新版)
//转载请注明出处--本文永久链接:http://www.cnblogs.com/ChenYilong/p/3496069.html 编号 iOS-Apple苹果官方文档翻译名称 博文链接地址 ...
- Findbugs插件安装与使用
FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具.FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析.FindBug ...
- Let's Encrypt 免费通配 https 签名证书 安装方法2 ,安卓签名无法认证!
Let's Encrypt 免费通配 https 签名证书 安装方法 按照上文 配置完毕后你会发现 在pc浏览器中正常访问,在手机浏览器中无法认证 你只需要安装一个或多个中级证书 1.查看Nginx ...
- 【项目管理】git和码云的使用【转】
转自:https://www.cnblogs.com/riverdubu/p/6491944.html 缘起 说了那么多关于git和码云相关的事,一直都没给大伙讲解这个码云究竟是个啥玩意儿. 今天就给 ...
- sqlalchemy更新和插入操作
def save_app_info(self): try: # update app_info print(self.dicts) data = db_session.query(App_Info). ...
- IO的学习与使用
一.IO的学习方法:IO中包含了很多的类,推荐的学习方式是:“举一反三,掌握一种,以此类推”. 二.I/O操作的目标: 输入:从数据源(在数据源和程序之间建立的一个数据流淌的“管道”)中读取数据(文件 ...
- Excel---导出与读取(大数据量)
Excel下载 首先大数据量的下载,一般的Excel下载操作是不可能完成的,会导致内存溢出 SXSSFWorkbook 是专门用于大数据了的导出 构造入参rowAccessWindowSize 这个参 ...
- acm专题---最短路
spfa的时间复杂度是0(e) 题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了很多年的畅 ...
- 20165301 预备作业二:学习基础和C语言基础调查
<做中学>读后感及C语言学习调查 读<做中学>有感 娄老师在文章中多次提到「做中学(Learning By Doing)」的概念,并通过娄老师自己的减肥经历.五笔练习经历.乒乓 ...
- MySQL之查漏补缺
1.TRUNCATE语句和DELETE语句的区别 1.delete语句,是DML语句,truncate语句通常被认为是DDL语句. 2.delete语句,后面可以跟where子句,通常指定where子 ...