二进制根号分治

news/2025/3/29 12:05:09/文章来源:https://www.cnblogs.com/whaled/p/18785720

题目链接

这里提供一种 \(\mathcal O(n \sqrt n)\) 的做法。

我们考虑开 \(2^d\) 个桶,范围为 \([0, 2^d-1]\),每个桶用一个 vector 维护。考虑把每一个元素的二进制分两部分处理,把二进制下位数小于 \(d\) 的部分(下文简称为低位)放到一个桶里统一处理,二进制下位数大于 \(d\) 的部分(下文简称为高位)单独预处理

操作 0

在桶中找到 \(v_x\) 的低位并删除,然后再异或掉 \(v_x\) 的高位。然后再加入 \(p\) 即可。

由于有操作 2,所以我们需要记录一个 \(cnt\) 表示当前已经进行操作 2 的次数,\(bs_i\) 表示第 \(i\) 个元素的低位上次被修改时操作 2 的次数,然后就可以得到 \(v_x\) 实际的低位。

由于用的是 vector 维护的桶,所以该操作时间复杂度为 \(\mathcal O(n)\),瓶颈在于 vector 的插入和删除,但是由于 vector 极其优秀的常数导致很难跑满(而且出题人貌似没想到卡

操作 1

只需要把每个桶维护的 vector 传给下一个桶即可,若 \(2^d\) 的桶里面有 vector,那么把里面的数的高位加一并把这个 vector 塞到 \(0\) 号桶里即可。

时间复杂度均摊为 \(\mathcal O(2^d + n / 2^d)\)

操作 2

遍历每个桶并异或,然后再加上之前高位的预处理即可。

时间复杂度为 \(\mathcal O(2^d)\)

显然当 \(d=\log(n) / 2\) 时时间复杂度为 \(\mathcal O(n \sqrt n)\)。,但我调的 \(d = 10\) 时最慢的点才跑了 73ms(

CODE

#include<bits/stdc++.h>
namespace whaleL{
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second
#define ull unsigned long long
#define ll long long
#define db double
#define re return
#define con continue
#define brk break
#define emp emplace
#define emb emplace_back
#define mpr make_pair
#define lwb lower_bound
#define upb upper_bound
#define all(x) x.begin(), x.end()
#define mms(a, b) memset(a, b, sizeof(a))
#define sml(a,b)(a=min(a,b))
#define big(a,b)(a=max(a,b))
#define fo(i,j,n)for(int i=(j);i<=(n);i++)
#define of(i,j,n)for(int i=(j);i>=(n);i--)
#define f(i,n)fo(i,1,n)
#define fr(i,n)of(i,n,1)
#ifdef _WIN32
#define getchar _getchar_nolock
#define putchar _putchar_nolock
#elif __linux__
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#endif
#define isd(c)((c)>47&&(c)<58)
#define iss(c)((c)<33)
#define il inline
#define tln template<typename m>
#define tls template<typename m,typename...ms>
#define getc(c) for(c=getchar();iss(c);c=getchar());
il void sf(){}il void ot(){}il void ut(){putchar('\n');}
tln il void sf(m&x){char f=1,c=getchar();x=0;for(;!isd(c);c=getchar())(c=='-')?f=-1:0;for(;isd(c);c=getchar())x=x*10+c-48;x*=f;}
tln il void ot(m x){x<0?x=-x,putchar('-'):0;static short s[51],t(0);do s[++t]=x%10;while(x/=10);for(;t;)putchar(s[t--]|48);}
il void sf(char&x){getc(x);}
il void ot(char x){putchar(x);}
il void sf(char*x){char c;getc(c);for(;!iss(c);c=getchar())*x++=c;*x=0;}
tln il void ot(m*x){while(*x)putchar(*x++);}
il void sf(string&x){x.clear();char c;getc(c);for(;!iss(c);c=getchar())x=x+c;}
il void ot(string x){printf("%s", x.c_str());}
il void sf(db&x){scanf("%lf", &x);}
il void ot(db x){printf("%lf", x);}
il void sf(long db&x){scanf("%Lf", &x);}
il void ot(long db x){printf("%Lf", x);}
tls il void sf(m&x,ms&...y){sf(x);sf(y...);}
tls il void ot(m x,ms...y){ot(x);ot(y...);}
tls il void ut(m x,ms...y){ot(x);putchar(' ');ut(y...);}
tln il void PC(m*a, m*b){for(;a!=b;cout<<*a++<<' ');ut();}
#ifndef ONLINE_JUDGE
#define err()cout<<"err "<<__LINE__,exit(0)
#define p(x...)(cout<<setw(18)<<#x,ot(" Line ",__LINE__," : "),ut(x))
#define pa(a, x...)(cout<<setw(18)<<#a,ot(" Line ",__LINE__," : "),ut(x))
#define po(x,y)(cout<<setw(18)<<#x,ot(" Line ",__LINE__," : "),PC(x,y))
#define g(x...) do{x;}while(0);
#else
#define err()1
#define p(x...)1
#define pa(x...)1
#define po(x...)1
#define g(x)
#endif
#ifndef DISFILE
#define file(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout)
#else
#define file(x)
#endif
const ull MOD = 1e9 + 7;
#define mo(x)((1ULL*x)%MOD)
#define ma(x,y)(x=mo(y+(x)))
};using namespace whaleL;
const int N = 2e5 + 233;
const int d = 1023;
const int D = 262143 - 1023;
#define d(x) ((x) & d)
#define D(x) ((x) & D)vector<int> e[N]; int en;
int a[N], p[N], bs[N];
int n, q, ans, cnt;void add(int i) {int u = d(a[i]);if (!p[u]) p[u] = ++ en;e[p[u]].insert(upb(all(e[p[u]]), i), i);ans ^= D(a[i]);
}signed main() {sf(n, q);f(i, n) sf(a[i]), add(i);int op, i, v, u, res;f(awa, q) {sf(op);if (op == 0) {sf(i, v);ans ^= D(a[i]);u = p[d(a[i] + cnt - bs[i])];e[u].erase(lwb(all(e[u]), i));a[i] = v;add(i);bs[i] = cnt;}else if (op == 1) {cnt ++;fr(j, d + 1) //倒序p[j] = p[j - 1], p[j - 1] = 0;if (p[d + 1]) {for (int j : e[p[d + 1]]) {ans ^= D(a[j]);a[j] |= d, a[j] ++;ans ^= D(a[j]);bs[j] = cnt;}p[0] = p[d + 1];}}else if (op == 2) {res = 0;f(j, d) if (e[p[j]].size() & 1) res ^= j;ut(ans ^ res);}}
}

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

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

相关文章

【每日一题】20250321

人嘛,反正就是这样。表面上做的跟心里想的,完全是两码事。表里不一,这很正常。【每日一题】 1.(14分) \(\hspace{0.7cm}\)如图所示的平面直角坐标系 \(xOy\),在第 \(\mathrm{I}\) 象限内有平行于 \(y\) 轴的匀强电场,方向沿 \(y\) 轴正方向;在第 \(\mathrm{IV}\) 象限的…

2025最新面试题-场景面试题MQ

RabbitMQ的消息处理模型 RabbitMQ的消息处理模型RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol) 协议的消息队列系统生产者(Producer)交换器(Exchange)路由键(Routing Key)队列(Queue)消费者(Consumer)生产者(Producer)生产者是消息的发送者,负责…

day:26 selenium——滚动条、key类

一.滚动条 代码:window.scrollTo(0,2000) from selenium import webdriver #导入selenium模块中的webdriver from selenium.webdriver.support.select import Select import time dx=webdriver.Chrome() #创建一个驱动谷歌浏览器的对象 dx.get("https://www.jd.c…

day:27 unittest实战梳理

一.将cms写入到unittest框架中 1.main调用所有用例import unittest from selenium import webdriver from time import * class Cms(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:pass@classmethoddef tearDownClass(cls) -> None:passdef s…

Redis问题 - Redis-cli.exe无法连接

Redis-cli.exe无法连接解决:打开redis-sever.exe 再回到redis-cli正常

超时

1接口超时2异常

openGl2

图元装配(Primitive Assembly) Primitive 也就是对顶点坐标,进行装配,形成形状 裁剪 原文:片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率 裁剪默认在片段着色前 最后一个阶段 在着色后,是Alpha测试和混合。会进行深度…

Mac安装php8.3配置Swoole环境

1、查看可安装的PHP版本brew search php 2、安装8.3的版本brew install php@8.3 3、设置环境变量vim ~/.zshrc放入上述第二步完成后提示的内容export PATH="/opt/homebrew/opt/php@8.3/bin:$PATH"export PATH="/opt/homebrew/opt/php@8.3/sbin:$PATH" e…

buuctf re rsa

先下载文件,然后打开压缩包有这样的文件,enc为二进制文件,key丢入文档读取文件就可以读取。得到n和e,然后取尝试分解n。分解成功,得到p和q,然后进行rsa解密算法的设计,因为enc为二进制文件,所以需要用open函数读取,然后使用rsa库文件进行解密。解出flag是flag{decrypt…

中高通量基因测序芯片有何不同-基因测序-测序芯片-flowcell-代加工-外协加工-委外加工-激光代加工-河南郑州-芯晨微纳(河南)

中高通量基因测序芯片的区别主要体现在样本处理能力、应用场景、技术设计以及数据产出效率等方面。以下是两者的详细对比: 中通两芯片外观:高通量芯片外观:定义与核心目标中通量基因测序芯片目标:适合中等规模样本的测序需求(例如数百至数千个样本/反应),平衡通量与成本…

ui自动化测试——unittest框架(自动化框架)

一、自动化框架介绍 1、unittest 框架是python中自带的框架 2、作用:管理和组织测试用例 当我们写的用例越来越多,我们就要考虑用例的编写的规范和组织,以便于后期的维护 3、常见的自动化框架:po框架、pytest 框架、unittest框架(我们讲解) 4、unitest 框架自带标准的库:…

代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践

通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。…