首页 > 其他分享 >P4301 [CQOI2013] 新Nim游戏 线性基

P4301 [CQOI2013] 新Nim游戏 线性基

时间:2024-05-09 20:00:34浏览次数:20  
标签:const Nim int 回合 P4301 return CQOI2013 define

P4301 [CQOI2013] 新Nim游戏 线性基

题目链接

题意

两个人进行游戏,有 \(n\) 堆火柴,每堆有若干根,在第一个回合中,双方可以直接拿走若干个整堆的火柴,可以一堆不拿,但不可以全部拿走。接下来的回合进行 \(Nim\) 游戏。 现在你是先手,第一回合如何拿才能保证获胜,并且让第一回合拿的数量尽量少。

思路

我们知道 \(Nim\) 游戏火柴数异或和为 \(0\) 则先手必败。所以我们想要获胜,必须保证后手无论怎么操作无法使剩余火柴数异或和为 \(0\) 即可。考虑线性基,如果这个数可以被已经插入的数表示出来,那么我们就必须第一回合把这堆取走,反之,则直接插入线性基即可。为了使得第一回合拿的火柴总数尽量小,我们从大到小进行枚举。

代码

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

int p[M];
void insert(int x){
    for(int i=63;i>=0;i--){
        if(x>>i&1){
            if(!p[i]){
                p[i]=x;
                return;
            }
            x^=p[i];
        }
    }
}

bool find(int x){
    for(int i=63;i>=0;i--){
        if(x>>i&1){
            if(!p[i]) return false;
            x^=p[i];
        }
    }
    return true;
}
void Showball(){
   int k;
   cin>>k;
   vector<int> a(k);
   for(int i=0;i<k;i++){
     cin>>a[i];
   }
   sort(all(a));
   LL res=0;
   for(int i=k-1;i>=0;i--){
     if(find(a[i])) res+=a[i];
     else insert(a[i]);
   }
   cout<<res<<endl;   
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

标签:const,Nim,int,回合,P4301,return,CQOI2013,define
From: https://www.cnblogs.com/showball/p/18182985

相关文章

  • 新NIM游戏
    稍微分析一下题目就可以知道,先手第一轮取完之后一定是极大无关组,此时必胜这里介绍一些异或空间线性基的性质,跟普通的线性基是差不多的首先,线性基中任意多个数异或起来一定不为\(0\)(否则的话某一个数可以被其他数线表)其次,同一异或空间不同线性基的个数是一样的那么我们怎么使得......
  • Educational Codeforces Round 165 (Rated for Div. 2) C. Minimizing the Sum题解
    题意CodeforcesRound809(Div.2)D1.ChoppingCarrots(EasyVersion)给你两个整数\(n(1\len\le3e5),k(0\lek\le10)\),一个数组\(a(1\lea_i\le10^9)\)。你可以进行如下操作最多\(k\)次:选定一个数\(i(1\lei\len)\),让其变为相邻的数(变为\(a_{i-1},a_{i......
  • 稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)
    背景OpenIM包含多个关键组件,每个都是系统功能必不可少的一部分。具体来说,MongoDB用于持久化存储;Redis用作缓存;Kafka用于消息队列;Zookeeper用于服务发现;Minio用于对象存储。这些组件的众多可能会增加部署的复杂性。此外,系统包含多个微服务模块,这要求有效管理进程的启动、停止......
  • 总结反思 持续进步-开源即时通讯(IM)项目OpenIM 新版本release-v3.7发布
    背景过去,我们团队对开源项目的认知较浅,过分追求进度,而忽视了代码的质量和规范。这导致了一些问题,例如部署流程设计不当:流程复杂、不规范,以及Mac与Windows部署的明显缺陷。这些问题不仅给开发者带来了困扰,也增加了社区维护的难度。针对这些挑战,我们团队进行了深刻的反思并总结出......
  • 利用动画延迟(animation-delay)实现复杂动画
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 小程序animation使用
    想实现一个item左滑展示编辑和删除按钮的功能,涉及到元素移动,因此使用animation属性来实现了解animation下面这段代码设置了一个动画的各种属性(持续1000ms;匀速到加速再减速;立即开始执行;元素变换基点,此处是平移,不起作用),然后设置动画效果向左平移100元素,最后,调用export()方法......
  • 5.CentOS-7-Minimal 安装KubernetesV1.23.17&DockerV20.10.23
    1.环境准备主节点IP:192.168.254.130node1IP:192.168.254.131node2IP:192.168.254.132OSversion:CentOS7miniCPUArchitecture:x86_64/amd64K8sversion:v1.23.17Dockerversion:20.10.232.安装前准备#安装依赖yuminstall-ycurlwgetsystemdbash-completi......
  • error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
    问题"commandfailed"err="failedtorunKubelet:validateserviceconnection:validateCRIv1runtimeAPIforendpointunix:///run/containerd/containerd.sock":rpcerror:code=Unimplementeddesc=unknownserviceruntime.v1.RuntimeSe......
  • Adobe Animate 2024 v24.0.2 (macOS, Windows) - 动画制作
    AdobeAnimate2024v24.0.2(macOS,Windows)-动画制作Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访问原......
  • SVG image animation All In One
    SVGimageanimationAllInOneSVG&GIFdemosSeethePen<ahref="https://codepen.io/xgqfrms/pen/GRLdzJj">SVGimageanimationdemo</a>byxgqfrms(<ahref="https://codepen.io/xgqfrms">@xgqfrms</a>......