题解 | #歇#

还原魔方

https://ac.nowcoder.com/acm/contest/27740/A

通过题目可知,要求得到m段区间^并且&起来最大,所以如果某一位有贡献,每一段的某一位都要有1,所以我们可以从高往低考虑,我们假设答案为x,先假设这一位1可以,那么x+=1<<i,然后判断可以不可以,怎么判断呢,每^起来==res就让sum++,最后看^==0并且sum>=m&&(sum-m)%2==0,就可以,具体实现可以看代码

/*made in mrd*/
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
#define endl '\n'
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
#define lu u<<1
#define ru u<<1|1
#define pb push_back
#define bug1(x) cout<<x<<endl
#define bug2(x,y) cout<<x<<' '<<y<<endl
#define pii pair<int,int>
#define bug3(x,y,z) cout<<x<<' '<<y<<' '<<z<<endl
void init()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
int n,m;
int a[N];
int b[N];
signed main() {
    init();
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int res=0;
    for(int i=30;i>=0;i--)
    {
            res+=(1<<i);
        for(int j=1;j<=n;j++)
        {
            b[j]=a[j]&res;
        }
        int sum=0;
        int cnt=0;
        for(int j=1;j<=n;j++)
        {
           sum^=b[j];
           if(sum==res) sum=0,cnt++;
        }
        if(sum==0&&cnt>=m&&(cnt-m)%2==0);
        else res-=(1<<i);
    }
    cout<<res<<endl;
    return 0;
}
全部评论
大佬可以细说下(sum-m)%2==0的意义吗?是因为每多两个段对题意没有影响吗
点赞 回复 分享
发布于 2022-02-15 15:51

相关推荐

能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务