博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CSAcademy]Or Problem
阅读量:7058 次
发布时间:2019-06-28

本文共 1174 字,大约阅读时间需要 3 分钟。

[CSAcademy]Or Problem

题目大意:

一个长度为\(n(n\le2\times10^5)\)的序列\(A(0\le A_i<2^{20})\),将其分为恰好\(m\)个连续段,设每一段的代价为这一段数字的或,总代价为每一段代价和。求最小代价和。

思路:

一个普通的DP思路是,对于每个数\(A_i\),枚举每一位,找到上一个在这一位上为\(1\)的数\(A_k\)\(A_{k+1\sim i}\)为最后一段。转移方程为\(f[i][j]=\max\{f[k][j-1]+\vee_{\ell=k+1}^i A_{\ell}\}\)

使用带权二分可以去掉\(m\)段的状态。

源代码:

#include
#include
#include
#include
inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}typedef long long int64;const int N=2e5+1,logN=18,logA=20;int n,st[N][logN],p[logA],g[N];int64 f[N];inline int lg2(const float &x) { return ((unsigned&)x>>23&255)-127;}inline int calc(const int &l,const int &r) { const int k=lg2(r-l+1); return st[l][k]|st[r-(1<
>j&1) p[j]=i; if(!p[j]) continue; const int64 tmp=f[p[j]-1]+calc(p[j],i)-c; if(f[i]
>1; solve(mid); if(g[n]>=m) { l=mid+1; ans=f[n]+1ll*m*mid; } else { r=mid-1; } } printf("%lld\n",ans); return 0;}

转载于:https://www.cnblogs.com/skylee03/p/10143780.html

你可能感兴趣的文章
易付宝 大苏宁战略的重要武器
查看>>
IPSec ***原理与配置
查看>>
让群辉支持DTS音轨
查看>>
移动端dropload插件的使用
查看>>
剑指OFFER(java)-二维数组中的查找
查看>>
华云数据与锐捷网络达成战略合作 聚焦行业云
查看>>
RHEL5.2利用lvm增加linux根分区的容量
查看>>
MDT 2013排错Provider:SQL Network Interfaces,error:26
查看>>
桌面支持--不能显示中文字体,系统已调成中文 而且不能打字
查看>>
古城钟楼微博:葡萄城程序员演练技术的产物
查看>>
最常用的四种数据分析方法
查看>>
Mesos安装部署笔记
查看>>
epoll的作用和原理介绍
查看>>
服务器远程监控管理(一)-硬件篇
查看>>
Android permission 工具类
查看>>
Tomcat使用与配置
查看>>
接口与抽象类的区别(转)
查看>>
转载:分析apk工具aapt的使用,解析其原理
查看>>
如何向视图插入数据
查看>>
注册和策略模式
查看>>