【题解】

引用ZYF神犇一句话:"显然位运算的极值问题都应该从高位向低位考虑。优先让这一位为0,如果行的话这一位就是0,否则就设为1。"

设答案为ans,从高位到低位枚举 是否有使ans的这一位为0的方案,注意到每一位是互相独立的

假设枚举到了倒数第x位,
即ans的最高位到倒数第x+1位的最优01分布已确定,现在正在判断第x位是否有可能填0:
对于每个x,考虑递推法:
设 布尔数组 f[i][j]表示:将前i个数分j段,能否在 得到的优美度的最高位到倒数第x+1位 都与ans一致的情况下,让倒数第x位为0
因为段与段之间的合并为or运算,所以递推方式为:
若 将前k个数(k<i)分j-1段,得到的优美度本身与ans一致,并且第j段的优美度也与ans一致,才可以由f[k][j-1]转移到f[i][j]
如何判断以上两个条件:
1. 得到的优美度的最高位到倒数第k+1位 是否与ans一致:( (S[i]-S[k])>>k | ans ) == ans (ans为0的位,S[i]-S[k]都不为1)
2. 得到的优美度的倒数第k位能否为0:( (S[i]-S[k]) & 1<<(k-1) ) == 0

对于每个x,若f[n][A~B]有至少一个为1,nas的第k位就可以为0

复杂度:O( logY * n^3 )

对于最后一组数据:A==1,B<=n,段数只有上限 
我们要想把f数组的第二个维度省掉的话,用f[i]记录将前i个数分段并得到可行解的最小段数,最后判断其是否小于B,即可

复杂度:O( logY * n^2 )

注意:第一次WA37是因为“1<<(LL)x-1LL”,这里第一个1没有写成1LL

【代码】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 100000
typedef long long LL;
LL s[2005];
int f[105][105],g[2005];
LL ans=0,t;
int n,A,B,len=0;
int min(int a,int b)
{if(a<b) return a;return b;
}
void work1()
{int x,i,j;for(x=len;x>0;x--){for(i=1;i<=n;i++)g[i]=INF;//g[0]=0;for(i=1;i<=n;i++)for(j=0;j<i;j++)if(g[j]<B){t=s[i]-s[j];if( (t>>(LL)x|ans)==ans && (t&1LL<<(LL)x-1LL)==0 ) g[i]=min(g[i],g[j]+1);}ans<<=1LL;if(g[n]>B) ans++;}
}
void work2()
{int x,i,j,k;for(x=len;x>0;x--){memset(f,0,sizeof(f));f[0][0]=1;for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=0;k<i;k++)if(f[k][j-1]){t=s[i]-s[k];if( (t>>(LL)x|ans)==ans && (t&1LL<<(LL)x-1LL)==0 ) f[i][j]=1;}for(i=A;i<=B;i++)if(f[n][i]) break;ans<<=1;if(i>B) ans++;}
}
int main()
{int i;scanf("%d%d%d",&n,&A,&B);for(i=1;i<=n;i++){scanf("%lld",&s[i]);s[i]+=s[i-1];}for(t=s[n];t>0;t>>=1)len++;if(A==1) work1();else work2();printf("%lld",ans);return 0;
}

[APIO2015]巴厘岛的雕塑(数位dp)相关推荐

  1. APIO2015巴厘岛的雕塑——数位DP

    题目:https://www.luogu.org/problemnew/show/P3646 对于A>1,将答案各位全置1,然后从高位到低位改成0判断是否可行: 用f[i][j]数组代表前i个数 ...

  2. 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP

    [BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...

  3. Bzoj4069:[Apio2015]巴厘岛的雕塑:dp+贪心

    题目链接:[Apio2015]巴厘岛的雕塑 一开始先写了个既错误又高复杂度的dp,令dp[i][j]=min(dp[i][k],dp[j][k-1]|(s[i]-s[j])),其中s[]代表前缀和 首 ...

  4. 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]

    巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...

  5. 4069: [Apio2015]巴厘岛的雕塑 DP+按位贪心

    去年的我对位运算一无所知..所以在考场上直接没敢看题..之后据说搜索有分,错的DP有分.我的内心是崩溃的..然而就算看了题还是什么都不会写. 考虑按位贪心,从高位到低位枚举,用 fi,j f_{i,j ...

  6. [APIO2015]巴厘岛的雕塑[按位贪心+dp]

    题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...

  7. P3646 [APIO2015]巴厘岛的雕塑

    非常好的二进制dp题 参考了这位大佬的思路:https://www.cnblogs.com/zbtrs/p/8495170.html #include<iostream> #include ...

  8. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  9. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

最新文章

  1. 使用Script元素发送JSONP请求
  2. 从bitmap到布隆过滤器,再到高并发缓存设计策略
  3. 毕业设计 c语言编译器的设计开发-字节代码格式设计与实现 开题报告,C语言编译器设计与实现...
  4. [html] 解释下你对GBK和UTF-8的理解?并说说页面上产生乱码的可能原因
  5. shell 替换字符串的几种方法,变量替换${},sed,awk
  6. std::string::assign 崩溃的问题
  7. 一种快速构造和获取URL查询参数的方法:URLSearchParams
  8. Maven配置之pom.xml(一)
  9. nagios 主机报警别名修改
  10. python数据库模式_python – 如何测试django数据库模式?
  11. 记一次简单的破解程序(逆向)
  12. PAIP.FLEX与JAVA数据对应关系.txt
  13. 黑马程序员之Web前端全栈 · 阶段一 前端开发基础 (1)
  14. 计算机专业英语求职信范文及翻译,英文求职信范文带翻译150字-.doc
  15. Ubuntu 串口调试
  16. 光纤跳线接口_2分钟让你搞懂跳线架和配线架的区别
  17. Java第二次作业|实验3 运算符、表达式和语句
  18. 深度学习笔记:神经网络权重确定初始值方法
  19. oracle sql优化的几条法则
  20. java刷票代码_Java 刷票器

热门文章

  1. 确定sw1开关信号输入端口_软件配合实现的“一键开关机电路”
  2. 二维码の数据编码Data Encoding
  3. CF13E Holes LCT
  4. 证件识别——图文智能处理OCR技术
  5. 达人评测 锐龙r7 6800hs和r9 5900hs差距大不大
  6. Mac电脑管理员登录密码破解方法
  7. 代码编程一条街,前端后端谁为先?
  8. 男士时尚衬衫:设计完美套装
  9. CI框架整合PHPExcel方法
  10. neo4j批量追加属性、节点、关系