题目大意:给定一个长度为 N 的序列,求序列中连续区间最大的(或和加与和)是多少。

题解:

引理:任意两个数 \(i, j\),若 \(i>j\),则在二进制表示下,i 对应的二进制串的字典序一定大于 j 对应的二进制串的字典序。

根据引理,若当前的最优解为 X,现考虑新加入一个元素 Y,有以下三种情况。

  1. 若 \(X>Y\),则 Y 不应加入 X 对答案的贡献中,因为对于或来说新加入 Y 的贡献会比 Y & X 对答案的负贡献小。
  2. 若 \(X=Y\),则无所谓。
  3. 若 \(X<Y\),不妨将 Y 设为当前最优解,结果会变得更优。

    综上,答案为序列中元素最大值的二倍。

二进制的最优解问题是具有贪心性质的,即:一个高位的 1 比所有低位均为 1 还要大。因此,只需每次尽量使得高位为 1 即可取得最优解。

另一种解法是 贪心+二分,枚举左端点,再根据二进制位从高到低进行贪心,用二分加速寻找最优的右端点。时间复杂度为 \(O(nlog^2n)\)。

代码如下

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e5+10;
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll fpow(ll a,ll b,ll c){ll ret=1%c;for(;b;b>>=1,a=a*a%c)if(b&1)ret=ret*a%c;return ret;}
inline ll read(){
ll x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
/*------------------------------------------------------------*/ ll n,b,p,a[maxn],sum[32][maxn]; void read_and_parse(){
n=read(),b=read(),p=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=0;i<=25;i++)
for(int j=1;j<=n;j++)
sum[i][j]=sum[i][j-1]+(a[j]>>i&1);
}
void solve(){
ll ans=0;
for(int i=1;i<=n;i++){
ll lb=i,rb=n,ret=0;
for(int bit=25;~bit;bit--){
if(a[i]>>bit&1){
ll l=lb-1,r=rb;
while(l<r){
int mid=l+r+1>>1;
if(sum[bit][mid]-sum[bit][i-1]==mid-i+1)l=mid;
else r=mid-1;
}
if(l==lb-1)ret+=(1<<bit);
else ret+=2*(1<<bit),rb=l;
}else{
ll l=lb,r=rb+1;
while(l<r){
int mid=l+r>>1;
if(sum[bit][mid]-sum[bit][i-1]>0)r=mid;
else l=mid+1;
}
if(r==rb+1)continue;
else ret+=(1<<bit),lb=r;
}
}
ans=max(ans,ret);
}
printf("%lld\n",fpow(ans+233,b,p));
}
int main(){
read_and_parse();
solve();
return 0;
}

【洛谷P4144】大河的序列的更多相关文章

  1. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  2. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  3. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  4. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  5. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...

  6. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  7. 【洛谷3321_BZOJ3992】[SDOI2015]序列统计(原根_多项式)

    题目: 洛谷3321 分析: 一个转化思路比较神(典型?)的题-- 一个比较显然的\(O(n^3)\)暴力是用\(f[i][j]\)表示选了\(i\)个数,当前积在模\(m\)意义下为\(j\)的方案 ...

  8. l洛谷 (水题)P4144 大河的序列

    题目戳 Solution: 这题前面都是废话,关键的一句就是本题求的是序列中连续一段的相与值(&)+相或值(|)最大,然后对这个值进行快速幂取模.考虑到两个数相与最大能得到的就是这两个数中的最 ...

  9. 洛谷P1415 拆分数列[序列DP 状态 打印]

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

随机推荐

  1. jenkins配置SSH远程服务器连接

    之前用jenkins做了一个自动发布测试,配置任务的Post Steps时,选择的是执行shell命令.如下图: 这是在本192.168.26.233服务器上测试的,此服务器上运行jenkins,to ...

  2. Socket构造但不连接

    Socket socket = new Socket(); SocketAddress address = new InetSocketAddress("localhost",80 ...

  3. 前端传递给后端且通过cookie方式,尽量传递id

    前端传递给后端且通过cookie方式,尽量传递id

  4. npm 和package.json 文件

    你可能还记得使用vue-cli 创建vue项目.当创建项目完成后,我们进入到项目目录,启动cmd命令窗口,输入npm install,它就会安装一堆东西(依赖),然后再输入npm run dev, 我 ...

  5. Nginx IP地址透传

    L:119

  6. Android View相关知识问答

    Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口

  7. ubuntu 14.04zabbix的安装

    开始安装 64位  Ubuntu 14.04.5 LTS \n \l 安装zabbix的源,以下操作在root下进行 # wget http://repo.zabbix.com/zabbix/3.0/ ...

  8. HDU4625 JZPTREE 【树形DP】【第二类斯特林数】

    题目大意: 对1到n求题目中描述的那个式子. 题目分析: 幂不好处理,转化为斯特林数. 根据$ n^k= \sum_ { i=0 }^k S(k,i)×i!×C(n,i) $. 我们可以将问题转化为对 ...

  9. Hard Life UVA - 1389(最大密度子图 输出点集)

    题意: rt 解析: 我用的第二种方法... s向所有的边连权值为1的边 所有的点向t连权值为mid的边 如果存在u -  > v  则边向u和v分别连一条权值为INF的边 二分mid 用dfs ...

  10. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游 LCT 泰勒展开

    题目大意 给你一棵树,每个点有一个函数\(f(x)\) 正弦函数 \(\sin(ax+b) (a\in[0,1],b\in[0,\pi],a+b\in[0,\pi])\) 指数函数 \(e^{ax+b ...