UOJ#110. 【APIO2015】Bali Sculptures
印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道。
在这条主干道上一共有 NN 座雕塑,为方便起见,我们把这些雕塑从 11 到 NN 连续地进行标号,其中第 ii 座雕塑的年龄是 YiYi 年。为了使这条路的环境更加优美,政府想把这些雕塑分成若干组,并通过在组与组之间种上一些树,来吸引更多的游客来巴厘岛。
下面是将雕塑分组的规则:
- 这些雕塑必须被分为恰好 XX 组,其中 A≤X≤BA≤X≤B,每组必须含有至少一个雕塑,每个雕塑也必须属于且只属于一个组。同一组中的所有雕塑必须位于这条路的连续一段上。
- 当雕塑被分好组后,对于每个组,我们首先计算出该组所有雕塑的年龄和。
- 计算所有年龄和按位取或的结果。我们这个值把称为这一分组的最终优美度。
请问政府能得到的最小的最终优美度是多少?
备注:将两个非负数 PP 和 QQ 按位取或是这样进行计算的:
- 首先把 PP 和 QQ 转换成二进制。
- 设 nPnP 是 PP 的二进制位数,nQnQ 是 QQ 的二进制位数,MM 为 nPnP 和 nQnQ 中的最大值。PP 的二进制表示为 pM−1pM−2…p1p0pM−1pM−2…p1p0,QQ 的二进制表示为 qM−1qM−2…q1q0qM−1qM−2…q1q0,其中 pipi 和 qiqi 分别是 PP 和 QQ 二进制表示下的第 ii 位,第 M−1M−1 位是数的最高位,第 00 位是数的最低位。
- PP 与 QQ 按位取或后的结果是: (pM−1ORqM−1)(pM−2ORqM−2)…(p1ORq1)(p0ORq0)(pM−1ORqM−1)(pM−2ORqM−2)…(p1ORq1)(p0ORq0)。其中:
- 0OR0=00OR0=0
- 0OR1=10OR1=1
- 1OR0=11OR0=1
- 1OR1=11OR1=1
输入格式
输入的第一行包含三个用空格分开的整数 N,A,BN,A,B。
第二行包含 NN 个用空格分开的整数 Y1,Y2,…,YNY1,Y2,…,YN。
输出格式
输出一行一个数,表示最小的最终优美度。
样例一
input
6 1 3
8 1 2 1 5 4
output
11
explanation
将这些雕塑分为 22 组,(8,1,2)(8,1,2) 和 (1,5,4)(1,5,4),它们的和是 (11)(11) 和 (10)(10),最终优美度是 (11OR10)=11(11OR10)=11。(不难验证,这也是最终优美度的最小值。)
子任务
- 子任务 1 (9 分)
- 1≤N≤201≤N≤20
- 1≤A≤B≤N1≤A≤B≤N
- 0≤Yi≤10000000000≤Yi≤1000000000
- 子任务 2 (16 分)
- 1≤N≤501≤N≤50
- 1≤A≤B≤min{20,N}1≤A≤B≤min{20,N}
- 0≤Yi≤100≤Yi≤10
- 子任务 3 (21 分)
- 1≤N≤1001≤N≤100
- A=1A=1
- 1≤B≤N1≤B≤N
- 0≤Yi≤200≤Yi≤20
- 子任务 4 (25 分)
- 1≤N≤1001≤N≤100
- 1≤A≤B≤N1≤A≤B≤N
- 0≤Yi≤10000000000≤Yi≤1000000000
- 子任务 5 (29 分)
- 1≤N≤20001≤N≤2000
- A=1A=1
- 1≤B≤N1≤B≤N
- 0≤Yi≤10000000000≤Yi≤1000000000
时间限制:1s
空间限制:64MB
贪心 DP 位运算
“同一组中的所有雕塑必须位于这条路的连续一段上”←这个性质看上去科学而优雅,这使得我们可以DP分段。
答案是位运算的结果,那么可以考虑贪心,显然从高到低考虑每一位,当前位能填0就填0,最后的结果肯定比当前位填1小。
数据范围比较小,可以从高到低分别考虑答案的每一个二进制位:
设f[考虑到第i个][分了j组]=当前位是否为0
简单DP枚举分段位置,如果 f[k][j-1]==0 (k以前的部分都不会使得当前位为1)
且 (sum[i]-sum[k])&(1<<pos)==0 (从k+1到i分成一段可行) 且 (((sum[i]-sum[k])|ans)>>pos) == (ans >> pos) (这么分组并不会改变更高位的答案)
那么f[i][j]=0
最后一组数据n==2000,用上面的方法复杂度太高了。由于A==1,所以可以用另一种DP方程类似地求解,具体看代码
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int f[][];
LL a[mxn],smm[mxn];
int g[mxn];
LL ans=;
int n,A,B;
void solve(){
for(int pos=;pos>=;pos--){
memset(f,,sizeof f);
f[][]=;
for(int i=;i<=n;i++)//now
for(int j=;j<=B;j++)//group
for(int k=;k<i;k++)
if(f[k][j-]== && (((smm[i]-smm[k])>>pos)&)== && (((smm[i]-smm[k])|ans)>>pos)==(ans>>pos)){
f[i][j]=;
break;
}
bool flag=;
for(int i=A;i<=B;i++)
if(f[n][i]==){flag=;break;}
if(!flag)ans|=1LL<<pos;
}
printf("%lld\n",ans);
return;
}
void solve2(){
for(int pos=;pos>=;pos--){
for(int i=;i<=n;i++)g[i]=0x3f3f3f3f;
g[]=;
for(int i=;i<=n;i++)
for(int j=;j<i;j++){
if((((smm[i]-smm[j])>>pos)&))continue;
if((((smm[i]-smm[j])|ans)>>pos)==(ans>>pos))g[i]=min(g[i],g[j]+);
}
if(g[n]>B)ans|=1LL<<pos;
}
printf("%lld\n",ans);
return;
}
int main(){
int i,j;
n=read();A=read();B=read();
for(i=;i<=n;i++){
a[i]=read();smm[i]=smm[i-]+a[i];
}
if(A==)solve2(); else solve();
return ;
}
UOJ#110. 【APIO2015】Bali Sculptures的更多相关文章
- UOJ#110. 【APIO2015】Bali Sculptures 贪心 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ110.html 题解 我们发现n=2000 的子任务保证A=1! 分两种情况讨论: $n\leq 100$ ...
- 【APIO2015】Bali Sculptures
题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 $N$ 座雕塑,为方便起见,我们把这些雕塑从 $1$ 到 $N$ 连续地进行标号,其中第 $i$ 座雕塑的年 ...
- uoj #111. 【APIO2015】Jakarta Skyscrapers
#111. [APIO2015]Jakarta Skyscrapers 印尼首都雅加达市有 NN 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 00 到 N−1N−1.除了这 NN 座摩 ...
- uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)
[题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...
- uoj #5. 【NOI2014】动物园 kmp
#5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...
- UOJ #148. 【NOIP2015】跳石头 二分
#148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...
- UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
- UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树
[NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...
随机推荐
- 买卖股票的最佳时机I II III IV
I 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. II 假设有一个数组,它的第i个元素是一个给定的股票 ...
- Spring学习(二)—— java的动态代理机制
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- TCP系列03—连接管理—2、TCP连接的同时打开和同时关闭
在前面的内容中我们介绍了TCP连接管理中最常见的三次握手方式和四次挥手的方式.但是有可能A和B两端同时执行主动打开并连接对方或者同时执行主动关闭连接(尽管发生这种情况的可能性比较低低),这个时候的流程 ...
- WPF 资源应用
对资源的应用,有好多方法,以下是一些应用,可以参考 1.静态资源: 2.动态资源: 3.项目面板中的资源: 4.图片.声音等资源
- nargchk函数 matlab【转】
功能说明 验证输入参数的个数 函数语法 msgstring = nargchk(minargs, maxargs, numargs)msgstring = nargchk(minargs, max ...
- 【bzoj2190】[SDOI2008]仪仗队 欧拉函数
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...
- hadoop 使用map将SequenFile里的小文件解压出来
上例中将HDFS里小文件通过mapper压缩到一个文件中,本例将这些小文件解压出来. mapreduce可以按SequenceFile的key进行分片. 1.mapper public class M ...
- 什么是Docker?(6-12)
关于什么是Docker,刚开始学的时候一脸懵X,这个东西到底是干嘛用的啊?偶然间在知乎上刷到一个比较通俗的解释: Docker就相当于一个容器,这个容器了不得了,它里面能搭好你项目需要的所有环境,并且 ...
- [NOIP2016 TG D2T3]愤怒的小鸟
题目大意:有一架弹弓位于(0,0)处,每次可以用它向第一象限发射一只小鸟,飞行轨迹均为形如y=ax2+bxy=ax+bx2 y=ax2+bx的曲线,且必须满足a<0(即是下开口的) 平面的第一象 ...
- UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...