【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
【BZOJ4069】[Apio2015]巴厘岛的雕塑
Description
Input
输入的第一行包含三个用空格分开的整数 N,A,B。
Output
输出一行一个数,表示最小的最终优美度。
Sample Input
8 1 2 1 5 4
Sample Output
explanation
将这些雕塑分为 2 组,(8,1,2) 和 (1,5,4),它们的和是 (11) 和 (10),最终优美度是 (11 OR 10)=11。(不难验证,这也是最终优美度的最小值。)
HINT
子任务 1 (9 分)
题解:考虑按位贪心来做。从高到低枚举答案的每一位,对于当前位,我们先check一下当前位=0能否满足要求,如果可以,则当前位=0,否则=1。那么如何check呢?考虑DP,用f[i][j]表示前i个雕塑分成j组是否可行,如果要求当前位=0可以满足要求,那么就把所有可能使得当前位!=0的转移都打上删除标记即可。
但是这样的转移时O(n^3)的啊,于是看了题解。。。md你告诉我最后一个子任务A=1!!!那么直接将DP方程该为f[i]表示将前i个雕塑最少能分成几组,然后转移就是O(n^2)的了。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
int n,A,B;
bool f[2][110],mp[2010][2010];
int g[2010];
ll ans,s[2010];
bool check(ll v)
{
if(v<=8)
{
v++,v--;
}
int i,j,k,d;
if(A==1)
{
memset(g,0x3f,sizeof(g)),g[0]=0;
for(i=1;i<=n;i++) for(j=0;j<i;j++)
if(!mp[i][j]&&!((s[i]-s[j])&v)) g[i]=min(g[i],g[j]+1);
return g[n]<=B;
}
memset(f[0],0,sizeof(f[0]));
f[0][0]=1;
for(i=1;i<=B;i++)
{
d=i&1;
memset(f[d],0,sizeof(f[d]));
for(j=1;j<=n;j++) for(k=0;k<j;k++) if(!mp[j][k]&&!((s[j]-s[k])&v)) f[d][j]|=f[d^1][k];
if(i>=A&&f[d][n]) return 1;
}
return 0;
} inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
int i,j;
for(i=1;i<=n;i++) s[i]=rd()+s[i-1];
for(ll k=1ll<<40;k;k>>=1)
{
if(check(k))
{
for(i=1;i<=n;i++) for(j=0;j<i;j++) if((s[i]-s[j])&k) mp[i][j]=1;
}
else ans|=k;
}
printf("%lld",ans);
return 0;
}
【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP的更多相关文章
- [APIO2015]巴厘岛的雕塑[按位贪心+dp]
题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...
- bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...
- [BZOJ4069][Apio2015]巴厘岛的雕塑
题目大意 分成 \(x\) 堆,是的每堆的和的异或值最小 分析 这是一道非常简单的数位 \(DP\) 题 基于贪心思想,我们要尽量让最高位的 \(1\) 最小, 因此我们考虑从高位向低位进行枚举,看是 ...
- [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
[APIO2015]巴厘岛的雕塑 题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...
- bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
- [APIO2015]巴厘岛的雕塑
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 Y ...
- [APIO2015]巴厘岛的雕塑 贪心+DP+特殊数据优化
写了好久.... 刚刚调了一个小时各种对拍,,,,最后发现是多写了一个等号,,,,内心拒绝 表示一开始看真的是各种懵逼啊 在偷听到某位大佬说的从高位开始贪心后发现可做 首先考虑小数据(因为可以乱搞) ...
- BZOJ 4069 [Apio2015]巴厘岛的雕塑 ——贪心
自己首先想了一种方法$f(i)$表示前$i$个最小值为多少. 然而发现位运算并不满足局部最优性. 然后我们可以从高到低贪心的判断,使得每一组的和在一个特定的范围之内. 还要特判最后一个Subtask, ...
- 4069: [Apio2015]巴厘岛的雕塑
Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 1 到 N 连续地进行标号,其中第 i 座雕塑的年龄 ...
随机推荐
- 数据库读写锁的实现(C++)
一.基本概念 在数据库中,对某数据的两个基本操作为写和读.分布有两种锁控制:排它锁(X锁).共享锁(S锁). 排它锁(x锁):若事务T对数据D加X锁,则其他不论什么事务都不能再对D加不论什么类型的锁. ...
- osg节点统计方法(点数 面数) 【转】
void statusNode(osg::ref_ptr<osg::Node> node,int& verNum,int& faceNum){ osg::ref_ptr&l ...
- ES6里关于函数的拓展(一)
一.形参默认值 Javascript函数有一个特别的地方,无论在函数定义中声明了多少形参,都可以传入任意数量的参数,也可以在定义函数时添加针对参数数量的处理逻辑,当已定义的形参无对应的传入参数时为其指 ...
- leetcode题解:Valid Parentheses(栈的应用-括号匹配)
题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...
- linux fork的缺点
Disadvantage of fork linux环境下, JBoss中调用curl下载文件, 发现curl占用的内存和JBoss一样多. Historical Background and Pr ...
- 【重点突破】—— Nodejs+Express+MongoDB的使用基础
前言:最近学习vue和react的高阶项目,都需要和Nodejs+Express+MongoDB结合实现全栈开发.这里结合实例Demo和所学项目集中总结一下这部分服务端的基础知识. 一.Express ...
- Resin服务器部署web项目
Resin服务器部署web项目 学习了:https://blog.csdn.net/eff666/article/details/53324167 需要配置resin.xml文件: <host ...
- azkaban2.5 具体配置以及使用方式
azkaban支持shell.java.mapreduce以及hive的工作流调度,在对这些不同类型任务调度之前须要配置所相应的插件:azkaban总体分为两部分azkaban executor se ...
- How to Handle Exception
- MySQL的四种变量类型
一.全局变量在系统运行期间动态更改其参数,重启后失效.SET GLOABL var=XXX;SET @@global.var=XXX;以上两种方式等效 查看系统的全局变量show global var ...