BZOJ 4245 OR-XOR

按位贪心。

前缀异或和没话说。一位为0当且仅当这一位有m个0,且第n个数这一位为0。

如果这一位可以为0,那么所有这一位为1的数以后都不能选。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500050
using namespace std;
long long n,m,a[maxn],ans=0,table[70];
bool vis[maxn];
void get_table()
{
    table[0]=1;
    for (long long i=1;i<=63;i++)
        table[i]=table[i-1]*2;
}
int main()
{
    get_table();
    scanf("%lld%lld",&n,&m);
    for (long long i=1;i<=n;i++) scanf("%lld",&a[i]);
    for (long long i=1;i<=n;i++) a[i]^=a[i-1];
    for (long long i=63;i>=0;i--)
    {
        long long ret=0;
        for (long long j=1;j<=n-1;j++)
        {
            long long bit=a[j]&table[i];
            if ((!(a[j]&table[i])) && (!vis[j]))
                ret++;
        }
        if ((ret>=m-1) && (!(a[n]&table[i])) && (!vis[n]))
        {
            for (long long j=1;j<=n;j++)
            {
                if (a[j]&table[i])
                    vis[j]=true;
            }
        }
        else ans|=table[i];
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-08-24 00:07:51

BZOJ 4245 OR-XOR的相关文章

BZOJ 4245: [ONTAK2015]OR-XOR 贪心

4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 567  Solved: 312[Submit][Status][Discuss] Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ... or c[m].请求出总费用的最小值. Input 第一行包含

bzoj 2337: [HNOI2011]XOR和路径

Description Input Output Sample Input Sample Output HINT Source Day2 终于把这个史前遗留的坑给填了... 首先异或的话由位无关性,可以按位处理... 那么对于每一位,设f[i]表示从i出发第一次到达n且xor和为1的概率,out[i]为i的出边,那么转移就比较容易了... if(w(i,j)&xxx) f[i]+=(1-f[j)/out[i];// 这条边该位为1,需要xor上0,xor和才为1 else f[i]+=f[j]/

【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Status][Discuss] Description 几乎是一路看题解过来了.. 拖了一个星期的题目- - 已然不会概率DP(说得好像什么时候会过一样),高斯消元(打一次copy一遍). 发现异或题目的新解决方法:按位处理.. 发现DP新方法:高斯消元. f[k][i]代表第k位权值起点为i到终点时答案

bzoj 2115: [Wc2011] Xor xor高斯消元

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大的XOR和(十进制结

BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有交,异或后那块交就没了,相当于那块走了环上的路径: 如果环与路径没交,就是走到环上走一圈在回来,一去一回其他的地方又没了. 求一棵生成树,然后每一条非树边构成一个环,一共$m-n+1$个环 然后答案就是任取一些环的异或和与1到n路径异或和异或的最大值啦 实现上注意: 1.求生成树和简单环的异或和一遍

BZOJ 2115: [Wc2011] Xor 线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 解法: 膜:http://www.cnblogs.com/ljh2000-jump/p/5869925.html 这道题要求从1到n的最大xor和路径,存在重边,允许经过重复点.重复边.那么在图上作图尝试之后就会发现,路径一定是由许多的环和一条从1到n的路径组成.容易发现,来回走是没有任何意义的,因为来回走意味着抵消.考虑这道题求得是路径xor和最大,所以必然我们要想办法处理环的情

BZOJ 4269: 再见Xor

4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 265  Solved: 159[Submit][Status][Discuss] Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. Output 一行,包含两个数,最大值和次大值. Sample Input 3 3 5 6 S

bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】

首先,我们发现,因为是无向图,所以相连的点之间是有"依赖性"的,所以不能直接用dp求解. 因为是xor,所以按位处理,于是列线性方程组,设$ x[i] $为点i到n异或和为1的期望,因为从1到n和从n到1一样,所以选择倒着推,即, if(deg[e[i].va]==0) \[ x[u]=\sum_{v}^{v\subset son(u)}\frac{x[v]}{deg[i]} \] else \[ x[u]=\sum_{v}^{v\subset son(u)}\frac{1-x[v])

BZOJ 2115 [Wc2011] Xor

题解:xor最大路径一定是几个环加上从1到n的路径 环用tarjan处理 最大xor和用线性基处理 喵啊 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long Lint; const int maxn=50007; int n,m; Lint ans; int cntedge; int head[maxn]; int to[maxn<

BZOJ 2115 [Wc2011] Xor ——线性基

[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有的简单环都可以经过各种各样的异或得到. 然后线性基,在从高位向低位贪心即可,至于证明,需要拟阵的相关知识. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath>