题目传送门

题目范围如果要求用longlonglong\ longlong long,在左移的时候一定要写成1LL1LL1LL!

题意

巴厘岛的一条主干道上共有NNN座雕塑,依次编号为111到NNN。雕塑 iii的年龄为YiY_iYi​。
政府想把这些雕塑分成恰好XXX组,要求每组不能为空,且每组雕塑的编号必须连续。每个雕塑必须属于某一组。
分组方案需要考虑美观程度。计算方法如下:分别计算每组雕塑的年龄之和,然后将每一组的结果按位取或,就得到了该分组方案的美观值。求最小的美观值

SolutionSolutionSolution

这道题首先想到题目中A、BA、BA、B限制分组条件,又看到数据范围分为A==1A==1A==1和A!=1A!=1A!=1两种情况,于是显然限制条件不同需要分情况讨论。

A!=1A!=1A!=1

这道题看起来是限制条件下的贪心,考虑如何贪心,显然最后答案的和一定是由010101串组成的,于是考虑如何分组使得010101串最小,显然这种思路可以转化为:构造一个ansansans看ansansans是否符合ABA\ BA B分组的限制条件。则考虑先构造一个一定最不优的ansansans并从高位到低位逐位将ansansans上的000转换成111看是否可行,验证构造的ansansans即可。
先令ansansans为当前最不优的情况(使其完全满足可贪心递推的条件),枚举每个ansansans看它是否符合贪心思想。boolboolbool型数组fi,kf_{i,k}fi,k​表示前iii个数,分成kkk组这种情况是否可行。根据iii值从前往后递推,如果此时讨论的连续序列符合当前的贪心思想,则对此时情况标记为可行。判断每个ansansans并更新,则一定能得到最优解。
代码细节问题:dpdpdp记得赋初值,要从已经赋过值的状态转移(虽然也许这种状态下的情况和实际矛盾,比如000个数分000组的方案数为111)。构造前缀和来直接检验那一段数列是否符合贪心,((s[k]−s[i])∣x)==x((s[k]-s[i])|x)==x((s[k]−s[i])∣x)==x,因为是“或”不是“异或”,所以这样就表示当前这样分组后符合贪心条件,不会使贪心变得不优。
曾经的疑惑:其实iii到kkk这段序列也不一定单独分一组更优,但是我们必须使分组条件满足组数≥A\geq A≥A,而在不会使答案更劣的情况下这样必定会使答案更符合题目限制。

A==1A==1A==1

此时大体思路和上面差不多,但是注意到这个时候NNN很大,又因为我们没有了最低分组数目的限制,所以可以直接将dpdpdp圧掉一维,用fif_ifi​表示前面iii个数分成多少组,检验最后分组数fnf_nfn​是否满足≤B\leq B≤B即可。
代码细节问题:这里fif_ifi​因为是取minminmin所以要记得赋最大值,同上赋初值f0=0f_0=0f0​=0

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005;
int s[N],ans,n,a,b;
inline int read(){int cnt=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){cnt=(cnt<<1)+(cnt<<3)+(c^48);c=getchar();}return cnt*f;
}
bool f[105][105];
int f2[2005];
inline bool check(int x){memset(f,0,sizeof(f));f[0][0]=1;for(int i=0;i<n;++i){//要从0开始 因为是从0赋的值 要不然推不过去 for(int j=0;j<b;++j){for(int k=i+1;k<=n;k++){if(((s[k]-s[i])|x)==x){f[k][j+1]|=f[i][j];//也不一定 i+1 要单独成一位 但是要满足a这个下限 所以在符合条件的时候要另开一组(k+1)保证更优 }}}}for(int i=a;i<=b;i++)if(f[n][i]) return true;return false;
}
inline bool check2(int x){memset(f2,63,sizeof(f2));f2[0]=0;//一定要记得赋最大值 for(int i=0;i<n;i++){for(int k=i+1;k<=n;k++){if(((s[k]-s[i])|x)==x)f2[k]=min(f2[k],f2[i]+1);//因为a==1 所以不考虑下限 圧掉一维 直接判在最后是否符合b }}if(f2[n]<=b) return true;return false;
}
signed main(){n=read(),a=read(),b=read();for(int i=1;i<=n;++i){s[i]=read();s[i]+=s[i-1];}if(a!=1){ans=(1LL<<50)-1;//相当于ans现在在二进制下是由49个1构成  for(int i=49;i>=0;i--){ans-=(1LL<<i);//将第i个1变成0  并判断此时贪心是否合法  if(!check(ans))ans+=(1LL<<i);//如果此时的ans不满足条件 则还原ans  }cout<<ans<<endl;}if(a==1){ans=(1LL<<50)-1;for(int i=49;i>=0;i--){ans-=(1LL<<i);if(!check2(ans))ans+=(1LL<<i);}cout<<ans<<endl;}return 0;
}

[APIO2015] T1巴厘岛的雕塑相关推荐

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

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

  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. [APIO2015]巴厘岛的雕塑[按位贪心+dp]

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

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

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

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

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

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

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

  8. [APIO2015]巴厘岛的雕塑(数位dp)

    [题解] 引用ZYF神犇一句话:"显然位运算的极值问题都应该从高位向低位考虑.优先让这一位为0,如果行的话这一位就是0,否则就设为1." 设答案为ans,从高位到低位枚举 是否有使 ...

  9. 【简●解】巴厘岛的雕塑

    [大意] 给定\(A\),\(B\),使一个区间的元素分为\(A\le x\le B\)组,每组的贡献为组内元素之和,最小化所有组贡献的或运算和. [分析] 开始一晃眼没看见区间连续这个条件,感觉做了 ...

最新文章

  1. NoClassDefFoundError: org/springframework/core/ErrorCoded 报错
  2. 英伟达奔驰共同发布自动驾驶系统,还自带停车功能
  3. 使用xdebug+wincachegrind的心得
  4. java语言适合编写什么_01--Java语言概述与开发环境 最适合入门的Java教程
  5. linux vscode配置spring boot开发环境
  6. C++在不使用任何算术运算符的情况下将两个数字相加(附完整源码)
  7. 谈谈Tensorflow的dropout
  8. Linux驱动(12)--LED驱动
  9. java图书进存销系统_【有源码】图书进销存系统
  10. 在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作)
  11. Golang Gin实践 连载十六 在图片上绘制文字
  12. 亲测:优酷下载的会员独享KUX视频快速转换成MP4格式!
  13. 免root卸载MIUI中在通知栏中推送广告的应用——msa
  14. 软考软件设计师下午真题-面向对象的程序设计与实现-访问者设计模式(2015年上半年试题六)Java代码讲解
  15. mysql hugepage_mysql启用hugepage-阿里云开发者社区
  16. cahrt框架 ios_iOS-Charts介绍
  17. moment.js时间操作
  18. SpringBoot 项目启动时设置 http 代理
  19. AceEditor使用小结
  20. 静则一念不生,动则万善相随

热门文章

  1. 1082: 敲7(多实例测试)-python
  2. CCSP国际注册云安全专家在中国设置考场
  3. 小白学Pytorch 系列--Torch API(1)
  4. 用谷歌浏览器打开本地unity webgl报错
  5. Java系列之JDBC和ODBC之间的区别与联系
  6. 模拟量采集模块4-20ma0-10v0-5v转rs485modbus 2/4/8/16路电流电压输出输入
  7. 〖产品思维训练白宝书 - 产品思维认知篇⑦〗- 聊一聊 产品经理 的工作内容与职责划分
  8. linux 磁盘操作
  9. N多计算机精品免费视频下载
  10. 韩剧TV APP案例分析