当前位置: 首页 > news >正文

2023 ICPC 网络赛 第一场(补题:F)

7题罚时879, 队排235,校排79。
除了I题dp没注意空间限制第一发没有用滚动数组MLE,以及G题启发式合并脑抽用set当容器T一发,以及K没注意是平方的期望白wa4发这些应当避免的失误外,基本满意。剩下的题基本都是当时写不出的了,在这里补一发F的题解。

本题解学自:知乎-CurryWOE

F. Alice and Bob(博弈 + 计数)

很妙的一个博弈思维题,并没有多难的算法,只是利用了题目的性质与博弈的基本思想,以及巧妙的计数方法,但实际比赛中还是很难想到的,银牌题中上的难度。

题意

给定大小为 n n n 的数组 a a a,Alice先手,两人轮流走步,每次可以选择两个数 a i , a j a_i, a_j ai,aj,将其任意改变(只能变为整数),设改变后为 a i 2 , a j 2 a_{i_2},a_{j_2} ai2,aj2,要求改变后满足 a i + a j = a i 2 + a j 2 a_i+a_j = a_{i_2}+a_{j_2} ai+aj=ai2+aj2,且 ∣ a i − a j ∣ < ∣ a i 2 − a j 2 ∣ |a_i-a_j|<|a_{i_2}-a_{j_2}| aiaj<ai2aj2. 最后不能走步的人输。
为了帮助Alice胜利,你可以选择保留任意 3 3 3 个数,移除其他数,问有多少方案使得Alice必胜。

思路

以上规则翻译过来就是,每次选的两个数必须使得两者差距变小,这样我们发现答案与数的大小无关,只与数的相对大小有关。于是我们可以分情况讨论什么样的三元组使得Alice必胜或必败。

设三元组为 ( x , y , z ) ( x ≤ y ≤ z ) (x, y, z)(x\leq y\leq z) (x,y,z)(xyz). 因为只与相对大小有关,可以通过平移转换为 ( 0 , x , x + y ) (0, x, x + y) (0,x,x+y),并且若 x > y x > y x>y 可以对称转换一下,使得 x < y x < y x<y 例如: ( 0 , 3 , 5 ) → ( − 5 , − 3 , 0 ) → ( 0 , 2 , 5 ) (0,3,5)\rightarrow(-5,-3,0)\rightarrow(0,2,5) (0,3,5)(5,3,0)(0,2,5).

接下来要用到博弈的思想:
1.所有终止状态都为必败态。
2.只要能转移到必败态的状态就是必胜态。
3.只能转移到必胜态的状态就是必败态。

分情况讨论

  1. x > 0 , y > 0 x > 0,y>0 x>0,y>0,三元组为 ( 0 , x , x + y ) (0, x, x + y) (0,x,x+y)
    我们考虑该三元组的下一个状态,有两种可能即 ( y , x , x ) (y, x, x) (y,x,x) 或者 ( x + k , x , y − k ) (x + k, x, y - k) (x+k,x,yk). 再考虑状态 ( y , x , x ) (y,x,x) (y,x,x) 的后继,只能为 ( x + k , x , y − k ) (x + k, x, y - k) (x+k,x,yk).
    ( y , x , x ) (y,x,x) (y,x,x) 为必败态,则当前状态可以转移到该必败态,当前为必胜态。
    ( y , x , x ) (y,x,x) (y,x,x) 为必胜态,由于其只有一个后继,说明该后继一定为必败态,而当前状态又能转移到该必败态,当前状态同样必胜。
    综上, ( 0 , x , x + y ) (0, x, x + y) (0,x,x+y) 一定为必胜态。

  2. x > 0 , y = 0 / x = 0 , y > 0 x > 0,y = 0/x = 0,y>0 x>0,y=0/x=0,y>0,三元组为 ( 0 , 0 , x ) (0, 0, x) (0,0,x) x > 0 x>0 x>0
    为何 ( 0 , x , x ) (0,x,x) (0,x,x) 同样为该状态,还是考虑平移与对称变化: ( 0 , x , x ) → ( − x , 0 , 0 ) → ( x , 0 , 0 ) (0,x,x)\rightarrow (-x,0,0)\rightarrow(x,0,0) (0,x,x)(x,0,0)(x,0,0). 而 y > 0 y>0 y>0 的情况因为只是一个变量名,将其名称与 x x x 交换即可。
    (1)若 x x x 为奇数当前状态的后继最多为 ( 0 , ⌊ x 2 ⌋ , ⌈ x 2 ⌉ ) (0,\lfloor\frac x2\rfloor,\lceil\frac x2\rceil) (0,2x,2x⌉) 即可以表示为 ( 0 , x , y ) ( x < y ) (0,x,y)(x<y) (0,x,y)(x<y). 而情况1 已经证明了该后继状态为必胜态,则当前状态为必败态。
    (2)若 x x x 为偶数当前状态后继若选择变为 ( 0 , x , y ) (0,x,y) (0,x,y),则必败。考虑另一种情况即将 x x x 一分为二变为 ( 0 , x 2 , x 2 ) (0,\frac x2,\frac x2) (0,2x,2x),此时我们发现又一次变为了情况2,说明这是一个递归的过程,而答案只与 x x x 包含的 2 2 2 的幂次有关。
    综上归纳整理有:若 x x x 包含的 2 2 2 的幂次为偶数先手必败,否则先手必胜。

合并起来看:

  1. 三元组 ( x , y , z ) , ( x < y < z ) (x,y,z),(x<y<z) (x,y,z),(x<y<z),必胜。
  2. 三元组 ( x , y , z ) , ( x = y / y = z ) (x,y,z),(x=y/y=z) (x,y,z),(x=y/y=z),若 ( z − x ) (z - x) (zx) 包含的 2 2 2 的幂次为偶数必败,否则必胜。
  3. 三元组 ( x , y , z ) , ( x = y = z ) (x,y,z),(x=y=z) (x,y,z),(x=y=z),必败。

现在我们考虑如何计数,直接求必胜态数量不好求,我们考虑容斥求出必败态数量再用总数减去。情况3的必败态数量很好求,我们只需要考虑情况2的。
遍历所有数,设当前数为 x x x,那么我们只需要求 ( p , x , x ) ( x > p ) (p,x,x)(x>p) (p,x,x)(x>p) ( x , x , z ) ( z > x ) (x,x,z)(z>x) (x,x,z)(z>x) 三元组中满足 x − p x - p xp z − x z - x zx 包含的 2 2 2 的幂次为偶数的个数即可,可以考虑用01字典树来维护。
2 2 2 的幂次的奇偶只与数末尾 0 0 0 的个数的奇偶有关,而二进制减法中 x − y = z x - y = z xy=z z z z 末尾的第一个 1 1 1 出现在 x , y x,y x,y 从末尾开始第一个数字不同的数位,我们倒序将数的数位插入字典树,查询数目后就是简单的组合数学问题了。
时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),对于 n ≤ 5 e 5 , ∑ n ≤ 3 e 6 n\leq5e5,\sum n\leq3e6 n5e5,n3e6 的数据范围还是很轻松能通过的。
具体实现见代码,有详细注释。

代码

/*
1. 三元组 (x,y,z),(x<y<z),必胜。
2. 三元组 (x,y,z),(x=y/y=z),若 (z - x) 包含的 2 的幂次为偶数必败,否则必胜。
3. 三元组 (x,y,z),(x=y=z),必败。 
*/
#include <bits/stdc++.h>
using namespace std;#define ll long long
const int N = 5e5 + 10;ll a[N];
int son[N * 62][2], cnt[N * 62], tot;
void clear(int p){if(son[p][0]) clear(son[p][0]);if(son[p][1]) clear(son[p][1]);son[p][0] = son[p][1] = cnt[p] = 0;
}void insert(ll x){int p = 0;for(int i = 0; i <= 60; i ++){ // 倒序插入int u = x >> i & 1;if(!son[p][u]) son[p][u] = ++ tot;p = son[p][u];cnt[p] ++;}
}ll search(ll x, int idx, int p, int ode){ // 查询的数x, 当前数位,字典树地址, 奇偶性ll sum = 0;int u = x >> idx & 1;if(son[p][!u] && !ode){ // 下一位数不同,且当前0的个数为偶数,即为差包含偶数次2的幂次,加入答案sum += cnt[son[p][!u]];}if(son[p][u]) sum += search(x, idx + 1, son[p][u], ode ^ 1); // 继续搜索return sum;
}ll C2(ll sum){ // C(sum, 2)return sum * (sum - 1) / 2LL;
}
ll C3(ll sum){ // C(sum, 3)return sum * (sum - 1) * (sum - 2) / 6LL;
}void solve(){int n;cin >> n;clear(0); tot = 0;for(int i = 1; i <= n; i ++){cin >> a[i];insert(a[i]);}sort(a + 1, a + 1 + n);ll ans = C3(n); // 总方案数for(int i = 1, r = 1; i <= n; i ++){while(r + 1 <= n && a[r + 1] == a[i]) r ++;ans -= C2(r - i + 1) * search(a[i], 0, 0, 0); // 情况2的必败数ans -= C3(r - i + 1); // 情况3的必败数i = r;}cout << ans;
}int main(){ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int t;cin >> t;for(int i = 1; i <= t; i ++){solve();if(i != t) cout << "\n";}return 0;
}

相关文章:

2023 ICPC 网络赛 第一场(补题:F)

7题罚时879&#xff0c; 队排235&#xff0c;校排79。 除了I题dp没注意空间限制第一发没有用滚动数组MLE&#xff0c;以及G题启发式合并脑抽用set当容器T一发&#xff0c;以及K没注意是平方的期望白wa4发这些应当避免的失误外&#xff0c;基本满意。剩下的题基本都是当时写不出…...

MySQL慢查询优化、日志收集定位排查、慢查询sql分析

MySQL慢查询日志收集、定位&#xff0c;慢查询分析、排查。 一 MySQL慢查询定位 1. 确定是否已开启慢查询日志 查看慢查询日志是否已经被开启&#xff1a; SHOW VARIABLES LIKE slow_query_log; 如果返回值是OFF&#xff0c;你需要开启它。 2. 开启慢查询日志 你可以临时在运…...

HZOJ-266:表达式计算

题目描述 ​ 给出一个表达式,其中运算符仅包含 ,-,*,/,^ 要求求出表达式的最终值。 ​ 数据可能会出现括号情况&#xff0c;还有可能出现多余括号情况&#xff0c;忽略多余括号&#xff0c;正常计算即可&#xff1b; ​ 数据保证不会出现大于 max long int 的数据&#xff1…...

JavaScript学习小结

变量声明&#xff1a;使用var关键字&#xff0c;变量没有类型&#xff0c;但值有类型&#xff08;弱类型语言&#xff09; 数据类型&#xff1a; ①number ②string&#xff08;单引号&#xff0c;双引号都可以表示字符串&#xff09; ③boolean ④Object类型 ⑤undefine…...

MySQL学习笔记13

DISTINCT数据去重&#xff1a; 案例&#xff1a;获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…...

怎么获取外网ip地址

在网络连接中&#xff0c;每个设备都被分配一个唯一的IP地址&#xff0c;用于标识和定位该设备。其中&#xff0c;内部或局域网IP地址是在局域网内使用的&#xff0c;而外网IP地址则是与公共互联网通信时所使用的地址。 获取外网IP地址对于许多人来说可能是一个常见的需求&…...

算法 只出现一次的两个数字-(哈希+异或)

牛客网: BM52 题目: 数组中仅2个数字出现1次&#xff0c;其余出现2次 思路: 出现2次的数字异或结果为0&#xff0c;另外两个不同的数字异或结果res不为0&#xff0c;异或结果的二进制位必与其中一个相同&#xff0c;求出二进制位为1的pos, 遍历数组&#xff0c;所有此位置为1…...

外卖霸王餐小程序、H5、公众号版外卖系统源码

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统&#xff0c;粉丝裂变玩源码下载&#xff0c;外卖cps小程序项目&#xff0c;外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码&#xff0c;外卖cps带分销返利后端源码&#xff0c;基于L…...

amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子

S905L3 带有投屏的功能&#xff0c;并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能&#xff0c;但是在测试中发现机顶盒关闭DLNA后&#xff0c;手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子&#xff0c…...

@Autowire、@Recourse用啥?

在使用IDEA写Spring相关的项目的时候&#xff0c;在字段上使用Autowired注解时&#xff0c;总是会有一个波浪线提示&#xff1a;Field injection is not recommended. 这是为啥呢&#xff1f;今天就来一探究竟。 众所周知&#xff0c;在Spring里面有三种可选的注入方式&#xf…...

[linux] 过滤警告⚠️

如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息&#xff0c;可以尝试以下方法&#xff1a; 使用warnings模块&#xff1a;导入warnings模块并设置warnings.filterwarnings("ignore")&#xff0c;这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...

Linux必备操作系统命令大全

一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数&#xff0c;只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数&#xff1a;目标目录名称。例如&#xff0c;若要进入 Document…...

【rtp】VideoTimingExtension 扩展的解析和写入

VideoTimingExtension 扩展有13个字节,并非都是字符串类型 class VideoTimingExtension {public:using value_type = VideoSendTiming;static constexpr RTPExtensionType kId = kRtpExtensionVideoTiming;static constexpr uint8_t kValueSizeBytes = 13...

网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你

目录 前言 一、内容简介 二、读者对象 三、专家推荐 四、全书目录 前言 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1…...

Winform直接与Wpf交互

Winform项目中&#xff0c;可以直接使用wpf中的自定义控件和窗体 测试环境&#xff1a; vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下&#xff1a; 1 新建winfrom项目&#xff0c;名为WinFormDemo&#xff0c;默认有一个名为Form1的窗体…...

Uni-app 调用微信地图导航功能【有图】

前言 我们在使用uni-app时&#xff0c;有时候会遇到需要开发地图和导航的功能&#xff0c;这些方法其实微信小程序的API已经帮我们封装好了 详见&#xff1a;微信小程序开发文档 接下来我们就演示如何用uni-app来使用他们 使用 <template><view><button type…...

Golang slice 通过growslice调用nextslicecap计算扩容

先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8&#xff1f; append了的4个元素&…...

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…...

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫Sim…...

vue截取地址参数

const getQueryValueFn () >{// 获取当前页面的URLconst currentURL window.location.href;//创建一个URL对象来解析当前URL。URL对象提供了方便的属性和方法来处理URL的各个部分const url new URL(currentURL);// 使用URLSearchParams获取查询参数const queryParams ne…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...