题目大意:给定一个长度为 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)\)。

代码如下

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define mp make_pair
  6. #define all(x) x.begin(),x.end()
  7. #define cls(a,b) memset(a,b,sizeof(a))
  8. using namespace std;
  9. typedef long long ll;
  10. typedef pair<int,int> P;
  11. const int dx[]={0,1,0,-1};
  12. const int dy[]={1,0,-1,0};
  13. const int mod=1e9+7;
  14. const int inf=0x3f3f3f3f;
  15. const int maxn=1e5+10;
  16. const double eps=1e-6;
  17. inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  18. inline ll sqr(ll x){return x*x;}
  19. 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;}
  20. inline ll read(){
  21. ll x=0,f=1;char ch;
  22. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  23. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  24. return f*x;
  25. }
  26. /*------------------------------------------------------------*/
  27. ll n,b,p,a[maxn],sum[32][maxn];
  28. void read_and_parse(){
  29. n=read(),b=read(),p=read();
  30. for(int i=1;i<=n;i++)a[i]=read();
  31. for(int i=0;i<=25;i++)
  32. for(int j=1;j<=n;j++)
  33. sum[i][j]=sum[i][j-1]+(a[j]>>i&1);
  34. }
  35. void solve(){
  36. ll ans=0;
  37. for(int i=1;i<=n;i++){
  38. ll lb=i,rb=n,ret=0;
  39. for(int bit=25;~bit;bit--){
  40. if(a[i]>>bit&1){
  41. ll l=lb-1,r=rb;
  42. while(l<r){
  43. int mid=l+r+1>>1;
  44. if(sum[bit][mid]-sum[bit][i-1]==mid-i+1)l=mid;
  45. else r=mid-1;
  46. }
  47. if(l==lb-1)ret+=(1<<bit);
  48. else ret+=2*(1<<bit),rb=l;
  49. }else{
  50. ll l=lb,r=rb+1;
  51. while(l<r){
  52. int mid=l+r>>1;
  53. if(sum[bit][mid]-sum[bit][i-1]>0)r=mid;
  54. else l=mid+1;
  55. }
  56. if(r==rb+1)continue;
  57. else ret+=(1<<bit),lb=r;
  58. }
  59. }
  60. ans=max(ans,ret);
  61. }
  62. printf("%lld\n",fpow(ans+233,b,p));
  63. }
  64. int main(){
  65. read_and_parse();
  66. solve();
  67. return 0;
  68. }

【洛谷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. Bootstrap 字体图标(Glyphicons)

    http://www.runoob.com/bootstrap/bootstrap-glyphicons.html 什么是字体图标? 字体图标是在 Web 项目中使用的图标字体.虽然,Glyphico ...

  2. 你不知道的JavaScript——this词法

    https://www.cnblogs.com/hutaoer/p/3423782.htmlhttps://www.cnblogs.com/vicky-li/p/8669549.htmlhttps:/ ...

  3. ubuntu18.04 安装 php7.2

    sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository p ...

  4. python之路--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  5. debug方法

    debug as -> spring boot->开始了 可以添加 ,, 来进行向下步骤:使用其他方法(在方法内打点) 一步步F6就可以了

  6. Js返回上一页,刷新页面,定时刷新,改变地址栏 等常用实用技巧

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  7. <resultMap>中 <collection>的使用

    public class Question implements Serializable { private int id; //问题Id private int accountId; //用户id ...

  8. Web API 2 Entity Framework 使用 Procedure

    Recently I worked on a project, which I started as code first and then I forced to switch to Databas ...

  9. hdu1878-并查集,欧拉回路

    纯裸题..写着方便理解... 题意:判断一个无向图是否存在欧拉回路... 解题思路:并查集判断一下是否联通,然后再判断一下点的度数是否为偶数就行了: #include<iostream> ...

  10. Qt QTimer

    QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用start( ...