[BZOJ4069][Apio2015]巴厘岛的雕塑
题目大意
分成 \(x\) 堆,是的每堆的和的异或值最小
分析
这是一道非常简单的数位 \(DP\) 题
基于贪心思想,我们要尽量让最高位的 \(1\) 最小, 因此我们考虑从高位向低位进行枚举,看是否存在一种方案使得最高为不为 \(1\),如果不存在,那就填 \(1\)
因此我们要解决如下问题:
- 保存之前的状态
- 考虑 \(A\), \(B\) 的限制
我们设已经考虑到 \(x\) 位,并且当前的值为 \(ans\)
显然如果该位可以不填,它必须满足存在一种状态使得之前已经决定的状态的异或和为 \(ans\), 并且新增的一段不会使得 \(ans\) 改变
那这就是一个经典的区间DP问题
我们不妨设 \(f[i][j]\) 表示前 \(i\) 个数分成 \(j\) 段,是否存在这一种情况
如果满足上述条件,我们就能够从 \(f[k][j - 1]\) 转移到 \(f[i][j]\)
对于每个一位,如果有一种给情况使得当前为为0,那就让 \(ans\) 的当前位为 \(0\)
复杂度:\(O(n^3logD)\)
对于最后一组数据:\(A =1, B \le n\),段数只有上限
我们要想把 \(f\) 数组的第二个维度省掉的话,用 \(f[i]\) 记录将前 \(i\) 个数分段并得到可行解的最小段数,最后判断其是否小于 \(B\),即可
复杂度:\(O(n^2logD)\)
总结
想了半天发现 \(O(n^3logD)\) 没办法优化,结果发现最后一个点的 \(A = 1\)。
const int maxn = 2018;
typedef long long LL;
LL s[maxn];
int f[maxn][maxn], g[maxn];
LL ans = 0, t;
int n, A, B, len = 0;
bool valid(LL val, int dig) {
return ((val >> (LL)dig | ans) == ans && (val & 1LL << (LL)dig-1LL) == 0);
}
void work1() {
for(int x = len; x > 0; -- x) {
forn(i, n) g[i] = INF;
forn(i, n) Forn(j, i) if (g[j] < B) {
t = s[i] - s[j];
if(valid(t, x)) if (g[j] + 1 < g[i]) g[i] = g[j] + 1;
}
ans <<= 1LL;
if(g[n] > B) ans ++;
}
}
void work2() {
for(int x = len; x > 0; -- x) {
memset(f, 0, sizeof(f));
f[0][0] = 1;
forn(i, n) forn(j, i) for (int k = 0; k < i; ++ k) if(f[k][j-1]) {
t = s[i] - s[k];
//printf("x = %d i = %d j = %d k = %d t = %d\n", x, i, j, k, t);
if(valid(t, x)) f[i][j] = 1;
}
int i;
for(i = A; i <= B; ++ i) {
if(f[n][i]) break;
}
ans <<= 1LL;
if(i > B) ans ++;
}
}
int main() {
read(n, A, B);
forn(i, n) {
read(s[i]); s[i] += s[i-1];
}
len = (int)log2(s[n]) + 1;
if (A == 1) work1();
else work2();
printf("%lld", ans);
return 0;
}
[BZOJ4069][Apio2015]巴厘岛的雕塑的更多相关文章
- bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...
- 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
- [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
[APIO2015]巴厘岛的雕塑 题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...
- bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
- 4069: [Apio2015]巴厘岛的雕塑
Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 1 到 N 连续地进行标号,其中第 i 座雕塑的年龄 ...
- [APIO2015]巴厘岛的雕塑
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 Y ...
- Luogu P3646 [APIO2015]巴厘岛的雕塑
深夜写题解系列,话说这题暑假的时候就在LOJ上做掉了,然后今天看到Luogu上有就去交了一下,发现没写过题解,赶紧来补一下 说句题外话APIO2015的题目好水啊 首先考虑按位取或的过程,很显然要从二 ...
- [APIO2015]巴厘岛的雕塑[按位贪心+dp]
题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...
- [APIO2015]巴厘岛的雕塑 贪心+DP+特殊数据优化
写了好久.... 刚刚调了一个小时各种对拍,,,,最后发现是多写了一个等号,,,,内心拒绝 表示一开始看真的是各种懵逼啊 在偷听到某位大佬说的从高位开始贪心后发现可做 首先考虑小数据(因为可以乱搞) ...
随机推荐
- Nginx的安装和配置文件
一.什么是Nginx 反向代理的高手,可以做web服务器.smtp服务器.ftp服务器,也可以做waf等等.原理,反向代理,收集client请求然后转发给自己lan内的服务器,将请求到的资源回转给客户 ...
- 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS
[BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...
- HDCMS常用的一些调用!
HDCMS常用的一些调用: 头部的标题/描述/关键词的调用: <title><?php if($hdcms['aid']):?><?php if($hdcms['seo_ ...
- onethink重新安装后,还原数据库后,登陆不了解决办法!
在用onethink开发的时候,为了防止修改出错,我会在开发下一个功能的对上一个功能代码整体进行备份,如果出错就返回上一个版本再次修改. 但是会发现一个问题,如果如果返回到上一个版本,重新安装完成之后 ...
- poj1191 棋盘分割【区间DP】【记忆化搜索】
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812 Description ...
- Python开发【项目】:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- docker网络部分源码分析
daemon初始化network controller daemon的配置,网络部分的内容在cmd/dockerd/config_common_unix.go中指定,默认设置一般都为空 // daem ...
- (2.12)Mysql之SQL基础——存储过程条件定义与错误处理
转自:博客园桦仔 5.存储过程条件定义与错误处理 -- (1)定义 [1]条件定义:declare condition_name condition for condition_value;[2]错误 ...
- grep命令做永久别名 显示颜色
grep命令做永久别名 显示颜色 http://jingyan.baidu.com/article/22fe7ced17c1543002617f9c.htmlhttp://blog.csdn.net ...
- html基础之css标签
css style: 里面的写的就叫做css,每一个样式的间隔用英文分号, 全部相同的时候引用class. css有三种写法: 1.在head标签中增加style标签,在style标签中去写css样式 ...