[APIO2015]巴厘岛的雕塑(数位dp)
【题解】
引用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)相关推荐
- APIO2015巴厘岛的雕塑——数位DP
题目:https://www.luogu.org/problemnew/show/P3646 对于A>1,将答案各位全置1,然后从高位到低位改成0判断是否可行: 用f[i][j]数组代表前i个数 ...
- 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
- Bzoj4069:[Apio2015]巴厘岛的雕塑:dp+贪心
题目链接:[Apio2015]巴厘岛的雕塑 一开始先写了个既错误又高复杂度的dp,令dp[i][j]=min(dp[i][k],dp[j][k-1]|(s[i]-s[j])),其中s[]代表前缀和 首 ...
- 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...
- 4069: [Apio2015]巴厘岛的雕塑 DP+按位贪心
去年的我对位运算一无所知..所以在考场上直接没敢看题..之后据说搜索有分,错的DP有分.我的内心是崩溃的..然而就算看了题还是什么都不会写. 考虑按位贪心,从高位到低位枚举,用 fi,j f_{i,j ...
- [APIO2015]巴厘岛的雕塑[按位贪心+dp]
题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...
- P3646 [APIO2015]巴厘岛的雕塑
非常好的二进制dp题 参考了这位大佬的思路:https://www.cnblogs.com/zbtrs/p/8495170.html #include<iostream> #include ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- 不要62 ---数位DP
题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...
最新文章
- 使用Script元素发送JSONP请求
- 从bitmap到布隆过滤器,再到高并发缓存设计策略
- 毕业设计 c语言编译器的设计开发-字节代码格式设计与实现 开题报告,C语言编译器设计与实现...
- [html] 解释下你对GBK和UTF-8的理解?并说说页面上产生乱码的可能原因
- shell 替换字符串的几种方法,变量替换${},sed,awk
- std::string::assign 崩溃的问题
- 一种快速构造和获取URL查询参数的方法:URLSearchParams
- Maven配置之pom.xml(一)
- nagios 主机报警别名修改
- python数据库模式_python – 如何测试django数据库模式?
- 记一次简单的破解程序(逆向)
- PAIP.FLEX与JAVA数据对应关系.txt
- 黑马程序员之Web前端全栈 · 阶段一 前端开发基础 (1)
- 计算机专业英语求职信范文及翻译,英文求职信范文带翻译150字-.doc
- Ubuntu 串口调试
- 光纤跳线接口_2分钟让你搞懂跳线架和配线架的区别
- Java第二次作业|实验3 运算符、表达式和语句
- 深度学习笔记:神经网络权重确定初始值方法
- oracle sql优化的几条法则
- java刷票代码_Java 刷票器