首页 > 其他分享 >[JZOJ4937] 与运算

[JZOJ4937] 与运算

时间:2022-12-29 14:35:49浏览次数:40  
标签:运算 lim LL num JZOJ4937 2m include define


Description

[JZOJ4937] 与运算_#define


[JZOJ4937] 与运算_#include_02

Solution

设F[i]表示当前前若干项异或起来为i的最大答案

考虑转移。
显然我们可以只转移i的一个二进制位。

找一位去掉,设去掉后为j,并求出有多少个a能包含j而不包含i(包含指i的所有1的位在这些a上对应的位也是1)

设num[i]表示有多少个包含i的。
显然包含j一定包含i
因此求的值就是num[j]−num[i]

然后直接转移即可。

关键在于预处理num
直接递推会有重复,怎么办呢。
观察特性
0~2m−1处理
可以分成[0~2m−1−1],[2m−1~2m−1]两部分,前一部分2m−1这一位是0,后一部分这一位是1。

所以显然后一部分每一个的num[i]可以转移到前一个的num[i−2m−1]中。

然后其他的m<script type="math/tex" id="MathJax-Element-3542">m</script>也类似,可以用分治的办法在两个区间分别下去。
为了避免重复,返回的时候再转移。

Code

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 1000005
#define M 1048576
#define LL long long
using namespace std;
int n;
LL a[N],num[M+5],f[M+5],lim;
void fd(LL l,LL r,LL c)
{
LL mid=1<<(c-1);
if(l>=r-1) return;
fd(mid+l,r,c-1);
fd(l,l+mid,c-1);
fo(i,0,mid-1) num[l+i]+=num[l+i+mid];
}
int main()
{
cin>>n;
memset(num,0,sizeof(num));
fo(i,1,n) scanf("%lld",&a[i]),num[a[i]]++,lim=max(lim,a[i]);
fd(0,lim,20);
LL ans=0;
fod(i,min(2*lim,(LL)M),1)
{
fo(j,0,19)
{
LL p=1<<j;
if((i&p)>0) f[i-p]=max(f[i-p],f[i]+((LL)i-p)*(num[i-p]-num[i]));
}
ans=max(ans,f[i]);
}
cout<<ans;
}


标签:运算,lim,LL,num,JZOJ4937,2m,include,define
From: https://blog.51cto.com/u_15925597/5977139

相关文章

  • 第二章《Java程序世界初探》第7节:关系运算符及条件语句
    ​关系运算符有==、!=、>、>=、<、<=。它们分别表示等于、不等于、大于、大于等于、小于和小于等于。关系运算符的作用是判断两个数据之间是否存在某种逻辑关系。既然是“判......
  • 第二章《Java程序世界初探》第5节:算术运算符
    在学习本小节内容之前,各位读者必须先理解几个概念:运算符、操作数和表达式。所谓“运算符”就是指具有一定运算意义的符号,例如+、-都是运算符。根据运算符完成运算所需数据量......
  • 第二章《Java程序世界初探》第6节:赋值运算符
    ​赋值运算符可以分为两类:普通赋值运算符和复合赋值运算符。普通赋值运算符只能起到简单的赋值作用,而复合赋值运算符则是先完成一次其他类型的运算然后再进行赋值操作。本小......
  • 逻辑运算符、位运算符
    逻辑运算符packageoperator;//逻辑运算符publicclassDemo05{publicstaticvoidmain(String[]args){//与(and)或(or)非(取反)booleana=tr......
  • 《安富莱嵌入式周报》第297期:开源生物医学成像系统,可肺部成像,C算法合集500例,突出极致
    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104  2022年最后一期周报,谢谢大家的陪伴视频版:https://www.bil......
  • @05.Python基本运算符
    文章目录​​一.基本运算符的介绍​​​​1.运算符概述​​​​2.运算符的分类​​​​二.基本运算符的使用​​​​1.算数运算符​​​​1》算数运算符的介绍​​​​2》P......
  • 掌握逻辑运算的窍门
    将二进制数表示的信息作为四则运算的数值来处理就是算术。而像图形模式那样,将数值处理为单纯的0和1的罗列就是逻辑。计算机能处理的运算,大体可分为算术运算和逻辑运算。算......
  • 移位运算和乘除运算的关系
    在了解了二进制数的机制后,接下来我们来看一下运算。和十进制数一样,四则运算同样也可以使用在二进制数中,只要注意逢2进位即可。下面,我们就来重点看一下二进制数所特有的运算......
  • Java千问14:学透Java自增自减运算符,看这一篇就够了!
    ​同很多高级编程语言一样,Java语言的运算符系统当中也有自增(++)和自减(--)这两个运算符。很多小伙伴对这两个运算符都深感头疼,并且很多公司在面试的时候也经常会问到与之相关......
  • 2-运算器
    运算器运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器等组成,它是数据加工处理部件,用于完成计算机的各种算术和逻辑运算。相对控制器而言,运算器接......