[CF1392G] Omkar and Pies

还是记一下这个 trick 吧,虽然很简单但是我认为十分有趣!本质上是 Maximize the Difference 做法的扩展。(似乎有人称作 RainFestivalTree???)

这个题经过一些简单转化可以转化为这样一个问题:给定有二进制数序列 \(A,B\),求 \(\max_{r-l\ge m} |A_l\oplus B_r|\)\(|x|\) 即二进制位下一的个数,\(\oplus\) 是异或)。

由于这个题有特殊性质,即序列 \(A,B\) 中所有元素的 popcount 都相等,所以我们只关注 \(|A_l\cap B_r|\),所以绝大多数题解给出了一个基于普通高维后缀和的 \(O(k2^k)\)

但是假设序列 \(A,B\) 没有任何特殊性质,这个题仍然可以做!我们考虑到异或信息也是可以 FWT 的,我们给 FWT 数组再开一维记录 popcount,合并的时候更新一下,就扩展到了序列任意的情况。这也是环一周和叉老师在模拟赛场上的写法,复杂度为 \(O(2^kk^2)\),空间复杂度 \(O(2^kk)\)

那我场上又写了个啥抽象玩意呢?事实上,对于上面这个问题,我们可以做到在线维护!

这个做法的基本思想是对于一般的 FWT 问题,假设你要增量维护其结果,你可以暴力 dfs 子集/超集,遇到已经访问了的就回退,这样每个集合只会被增广一次。

那么对于此题中的多带了一维的异或 FWT,其也可以施加暴力 dfs 的技巧。具体地,我们增量维护一个集合 \(S\),并记录 \(f\) 数组表示对于所有长为 \(k\) 数到 \(S\) 中数的最小汉明距离,即 \(f_x=\min_{y\in S} |x\oplus y|\)

每次往 \(S\) 加入一个元素 \(x\) 时,我们暴力 dfs 这个元素的邻域,如果当前元素 \(y\)\(x\) 的距离不小于 \(f_y\) 就直接返回。这样,对于每一个元素,其 \(f\) 只会至多被更新 \(O(k)\) 次,每次更新至多耗费 \(O(k)\) 的时间复杂度。总时间复杂度也是 \(O(2^kk^2)\),但空间做到了 \(O(2^k)\) 且可以强制在线。

如果到当前元素汉明距离比当前答案还大的话还可以剪枝,数据基本不可能卡满而且除了一堆常数,所以事实上这个算法竟然能跑过一大堆 \(O(2^kk)\)

#include <cstdio>
using namespace std;
int read(){char c=getchar();int x=0;while(c<48||c>57) c=getchar();do x=x*10+(c^48),c=getchar();while(c>=48&&c<=57);return x;
}
const int N=10000003,K=20,INF=0x3f3f3f3f;
int n,m,k,o;
int res=INF,ix=-1,iy=-1;
int f[1<<K],ps[1<<K];
bool vis[1<<K];
int px[N],py[N],p[N];
int A[N],B[N];
void dfs(int s,int d,int lim){if(d>=res||f[s]<=d) return;f[s]=d;if(ps[s]>=o+m) res=d,ix=o,iy=ps[s];for(int i=lim;i<k;++i) dfs(s^(1<<i),d+1,i+1);
}
int main(){n=read();m=read();k=read();char cc=getchar();while(cc!='0'&&cc!='1') cc=getchar();for(int i=0;i<k;++i){if(cc=='1') A[n+1]|=(1<<i);cc=getchar();}while(cc!='0'&&cc!='1') cc=getchar();for(int i=0;i<k;++i){if(cc=='1') B[n+1]|=(1<<i);cc=getchar();}for(int i=0;i<k;++i) p[i]=i;for(int i=1;i<=n;++i) px[i]=read()-1,py[i]=read()-1;for(int i=n;i;--i){int X=p[px[i]],Y=p[py[i]];p[px[i]]=Y;p[py[i]]=X;px[i]=X;py[i]=Y;}for(int i=n;i;--i){A[i]=A[i+1];B[i]=B[i+1];if(((A[i]>>px[i])^(A[i]>>py[i]))&1) A[i]^=(1<<px[i])^(1<<py[i]);if(((B[i]>>px[i])^(B[i]>>py[i]))&1) B[i]^=(1<<px[i])^(1<<py[i]);}for(int i=1;i<=n+1;++i) ps[B[i]]=i;for(int s=0;s<(1<<k);++s) f[s]=INF;for(o=1;o<=n+1;++o) dfs(A[o],0,0);printf("%d\n%d %d\n",k-res,ix,iy-1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739420.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零学习的JAVAday1~day7

作为一个刚要迈入大二的预备程序员,已经学习过了c语言和c++的部分知识,在暑假期间满怀期待的开始Java的学习,希望一个暑假可以对Java的了解加深一些。 学习Java首先要学习windows电脑的cmd命令: 同时点击键盘上面的win+r键输入cmd即可进入默认的cmd面版,然后我们就可以输入…

面试官:Java线程可以无限创建吗?

哈喽,大家好🎉,我是世杰。 ⏩本次给大家介绍一下操作系统线程和Java的线程以及二者的关联1. 面试连环callJava线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区分内核态和用户态?⏩要想解答这些问题,我们要先从操作系统线程开始说起,让我们…

标准IO与系统IO

C平台的标准IO(可跨系统)Linux 系统IO (Linux系统平台才能使用)Linux系统的IO(输入输出)特点主要包括以下几个方面 1)文件视为一切:在Linux中,几乎所有的设备和资源都被视为文件。这意味着无论是硬件设备(如磁盘、网络接口)还是系统资源(如进程、内存),它们都可以通…

比snipaste更好用的截图工具 pixpin

pixpin官网功能介绍与 snipaste 的功能相似,比snipaste好用作者:mohistH 出处:https://www.cnblogs.com/pandamohist/ 本文版权归作者和博客园共有,谢绝一切形式的转载,否则将追究法律责任。

HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]

分析 观察到是曼哈顿距离 \(\le r\) 的范围可以扫到,联想到如下图形:左边是 \(r=1\) 可以扫到的范围,右边是 \(r=2\) 可以扫到的范围。 于是,我们只要对这样的图形在 \(1000*1000\) 的格子里差分一下就好了 。 但这样的复杂度是 \(O(nm)\) 的,会死的很惨。 优化 不难发现这…

[VSCode] Add all missing import

https://github.com/microsoft/vscode-docs/blob/vnext/release-notes/v1_46.md#add-all-missing-imports-source-action

秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

《从零开始学习Python爬虫:顶点小说全网爬取实战》

文章优势:最新内容更新:最近几天整理,包含最新的爬虫技术和实践经验。 精致内容汇总:基于培训课程笔记,内容丰富、详细,适合初学者入门及进阶。顶点小说 装xpath helper GitHub - mic1on/xpath-helper-plus: 这是一个xpath开发者的工具,可以帮助开发者快速的定位网页元素…

LRU算法简介

LRU(Least Recently Used,最近最少使用)算法是一种常用于缓存管理的算法,用于在缓存空间有限的情况下,决定哪些数据应该被移除。它的基本思想是:如果一个数据最近被访问过,那么在将来一段时间内它被再次访问的概率较高。因此,当缓存已满,需要移除数据时,优先移除那些…

数据结构小学期第六天

今天完全实现了九宫格拼图游戏,具备一键通关功能按下W键,查看原图功能按住A键不松,移动图片按上下左右键,如果你自己想要实现这个功能,需要自己的图片,图片格式要求。 每个小图片是105*105,完整图片是315*315.有人想要做一下,可以试一试。代码如下 启动类1 import com.…

1、flask-基本架构-MVT - 虚拟环境的安装 - 创建flask应用

flask基本架构图 创建虚拟环境 #1. 打开cmd或pycharm都可以(确保安装python环境) #2. 安装虚拟环境模块-windows - pip install virtualenv virtualenvwrapper-win#3. 查看虚拟环境 - workon#4. 创建虚拟环境 - mkvirtualenv flask2env - 默认创建在:C:\Users\Administrato…

基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM)

大语言模型在垂直细分领域存在知识局限、幻觉、数据安全等一些问题,可通过RAG(检索增强生成)方案来解决。本文基于AnythingLLM框架,搭建团队私有知识库系统,并进行使用和验证,RAG系统在保留输出的有效性同时,还保留了创造性……自 ChatGPT 发布以来,大型语言模型(Larg…