P4887 【模板】莫队二次离线(第十四分块(前体))

P4887 【模板】莫队二次离线(第十四分块(前体))

Solution

简单学习了一下二次离线莫队,写了个板子题。

这题直接莫队时间复杂度为O(Cnn)O(Cn\sqrt n)O(Cnn),其中C=(14k)C=\binom{14}{k}C=(k14),显然不太行。

我们考虑当前区间为[l,r][l,r][l,r],右端点增加kkk,变为[l,r+k][l,r+k][l,r+k]产生的贡献:

f(x,[l,r])=[∑i=lrpopcount(xxorai)=k]f(x,[l,r])=[\sum_{i=l}^rpopcount(x\;xor\;a_i)=k]f(x,[l,r])=[i=lrpopcount(xxorai)=k]

则有:
Δans\Delta ansΔans

=∑i=r+1r+kf(i,[l,i−1])=\sum_{i=r+1}^{r+k}f(i,[l,i-1])=i=r+1r+kf(i,[l,i1])

=∑i=r+1r+kf(i,[1,i−1])−f(i,[1,l−1])=\sum_{i=r+1}^{r+k} f(i,[1,i-1])-f(i,[1,l-1])=i=r+1r+kf(i,[1,i1])f(i,[1,l1])

于是我们可以预处理f(i,[1,i−1])f(i,[1,i-1])f(i,[1,i1]),并且离线求出∑i=r+1r+kf(i,[1,l−1])\sum_{i=r+1}^{r+k}f(i,[1,l-1])i=r+1r+kf(i,[1,l1])。这个可以在O(Cn+mn)O(Cn+m\sqrt n)O(Cn+mn)的时间内完成。

其他端点的移动同理。

总时间复杂度为O(Cn+mn)O(Cn+m\sqrt n)O(Cn+mn)

Code

const int MX = 1 << 14;
int b[MX], sum[MX], a[MAXN], sz, bnum = 0, Cnum = 0, n, m, K;
ll s0[MAXN], s1[MAXN], Ans[MAXN];
struct Cnode{ int l, r, x, id; ll ans; } C[MAXN << 1];
struct Qnode{ int l, r, id; } Q[MAXN];void Init() {for (int i = 0; i < MX ; ++ i) if (__builtin_popcount(i) == K) b[++ bnum] = i;sort(Q + 1, Q + m + 1, [&](Qnode a, Qnode b){ return ((a.l - 1) / sz < (b.l - 1) / sz) || ((a.l - 1) / sz == (b.l - 1) / sz && a.r < b.r); });for (int i = 1, l = 1, r = 0; i <= m ; ++ i) {if (r < Q[i].r) ++ Cnum, C[Cnum] = (Cnode){r + 1, Q[i].r, l - 1, Cnum, 0}, r = Q[i].r;if (r > Q[i].r) ++ Cnum, C[Cnum] = (Cnode){Q[i].r + 1, r, l - 1, Cnum, 0}, r = Q[i].r;if (l < Q[i].l) ++ Cnum, C[Cnum] = (Cnode){l, Q[i].l - 1, r, Cnum, 0}, l = Q[i].l;if (l > Q[i].l) ++ Cnum, C[Cnum] = (Cnode){Q[i].l, l - 1, r, Cnum, 0}, l = Q[i].l;}
}
void Work() {sort(C + 1, C + Cnum + 1, [&](Cnode a, Cnode b){ return a.x < b.x; });for (int i = 0; i < MX ; ++ i) sum[i] = 0;for (int i = 1, nw = 0; i <= Cnum ; ++ i) {while (nw < C[i].x) {++ nw;for (int j = 1; j <= bnum ; ++ j) ++ sum[a[nw] ^ b[j]];}int Sum = 0;for (int j = C[i].l; j <= C[i].r ; ++ j) Sum += sum[a[j]];C[i].ans = Sum;} for (int i = 0; i < MX ; ++ i) sum[i] = 0;for (int i = 1; i <= n ; ++ i) {s0[i] = s0[i - 1] + sum[a[i]];for (int j = 1; j <= bnum ; ++ j) ++ sum[a[i] ^ b[j]];s1[i] = s1[i - 1] + sum[a[i]];}
}
void Solve() {sort(C + 1, C + Cnum + 1, [&](Cnode a, Cnode b){ return a.id < b.id; });for (int i = 1, l = 1, r = 0, nw = 0; i <= m ; ++ i) {Ans[Q[i].id] = Ans[Q[i - 1].id];if (r < Q[i].r) ++ nw, Ans[Q[i].id] += (s0[Q[i].r] - s0[r]) - C[nw].ans, r = Q[i].r;if (r > Q[i].r) ++ nw, Ans[Q[i].id] -= (s0[r] - s0[Q[i].r]) - C[nw].ans, r = Q[i].r;if (l < Q[i].l) ++ nw, Ans[Q[i].id] += (s1[Q[i].l - 1] - s1[l - 1]) - C[nw].ans, l = Q[i].l;if (l > Q[i].l) ++ nw, Ans[Q[i].id] -= (s1[l - 1] - s1[Q[i].l - 1]) - C[nw].ans, l = Q[i].l;}
}
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifread(n), read(m), read(K), sz = (int)sqrt(n);for (int i = 1; i <= n ; ++ i) read(a[i]);for (int i = 1; i <= m ; ++ i) read(Q[i].l), read(Q[i].r), Q[i].id = i;Init();Work();Solve();for (int i = 1; i <= m ; ++ i) print(Ans[i]), putc('\n');return 0;
}

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

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

相关文章

P1297 [国家集训队]单选错位 期望

传送门 题意&#xff1a; 思路&#xff1a; 手推了一下没想到还真的能过。 对于相邻的两个数aia_iai​和ai1a_{i1}ai1​&#xff0c;分两种情况讨论&#xff1a; (1) ai<ai1a_i<a_{i1}ai​<ai1​ 时&#xff0c;答案在[1,ai][1,a_i][1,ai​]的范围内概率为aiai1\fra…

也读《人月神话》:没有银弹的软件工程

一、关于人月神话这本书记得在上大学的时候&#xff0c;就经常听学长和老师讲起《人月神话》&#xff0c;但是却一直没有阅读。记得当时一听到这个书名&#xff0c;还以为是个神马科幻类别的书&#xff0c;结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父…

CF1088F. Ehab and a weird weight formula(倍增)

CF1088F. Ehab and a weird weight formula Solution 这题大概是个大力找性质题&#xff08;莫名感觉学习文化课有利于找性质&#xff1f;&#xff01;&#xff1f;&#xff09;。 性质1&#xff1a;不难发现一个点比它权值小的有且仅有一个&#xff08;最小权点除外&#x…

P6154 游走 概率dp

传送门 题意&#xff1a; 思路&#xff1a; 给你个DAGDAGDAG&#xff0c;由于每一条路径出现概率相等&#xff0c;那么期望就是总长度路径个数\frac{总长度}{路径个数}路径个数总长度​。设f[i]f[i]f[i]表示到iii这个点的总长度&#xff0c;g[i]g[i]g[i]表示到iii这个点路径的…

[译]如何在C#中调试LINQ查询

LINQ是我在C#中最喜欢的功能之一。它让代码看起来更漂亮美观。我们得到了一个易于编写和理解的简洁函数式语法。好吧&#xff0c;至少我们可以使用LINQ方法的语法风格。LINQ很难进行调试。我们无法知道该查询内部发生了什么。我们可以看到输入和输出&#xff0c;但这就是它的全…

CF1303F - Number of Components(并查集)

CF1303F - Number of Components Solution 思路还是有点妙的。 容易想到并查集&#xff0c;但是并查集不容易维护删边&#xff0c;怎么办呢&#xff1f; 我们考虑拆贡献&#xff0c;把加边的贡献和删边的贡献拆开&#xff0c;分别维护。 只加边就是四连通加边&#xff0c;算…

CodeForces - 375D Tree and Queries 树启 + 思维

传送门 题意&#xff1a; 思路&#xff1a; 很明显子树问题会想到树启&#xff0c;让后如何updateupdateupdate呢&#xff1f;一个显然的思路就是维护一个树状数组&#xff0c;查询次数>kj>k_j>kj​的个数。但是这样复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)的&#xf…

WebSocket数据加密——AES与RSA混合加密

前言之前在写“一套简单的web即时通讯”&#xff0c;写到第三版的时候没什么思路&#xff0c;正好微信公众号看到一篇讲API交互加密&#xff0c;于是就自己搞了一套AES与RSA混合加密&#xff0c;无意中产生应用在WebSocket想法&#xff0c;好在思路都差不多&#xff0c;稍微改动…

CF1365G Secure Password(构造,交互,二进制分组)

CF1365G Secure Password Solution 妙妙思维题。 注意到(136)>n\binom{13}{6}>n(613​)>n。&#xff08;谁tm能注意到这个&#xff1f;&#xff01;&#xff1f;&#xff09; 我们可以把所有13位二进制数中有6个1的拿出来给nnn个数重标号。然后对于每一位iii&…

基于 EntityFramework 生成 Repository 模式代码

借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查&#xff0c;动态生成一些代码完成基本的增删改查&#xff0c;而这些增删改查代码大多类似&#xff0c;只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF …

Codeforces Round #601 (Div. 2)

传送门 文章目录A.Changing Volume题意&#xff1a;思路&#xff1a;B. Fridge Lockers题意&#xff1a;思路&#xff1a;C. League of Leesins题意&#xff1a;思路&#xff1a;D. Feeding Chicken题意&#xff1a;思路&#xff1a;E1 E2. Send Boxes to AliceA.Changing Volu…

CF1375G. Tree Modification(贪心,黑白染色)

CF1375G. Tree Modification Solution 假设我们取定了根&#xff0c;那么只可能从深度大的点接到深度小的点&#xff0c;我们每次取一个高度为2的子树接到该子树的父亲&#xff0c;这样取一定不劣&#xff0c;操作次数相当于是偶数深度点&#xff08;根深度为0&#xff09;的…

P3168 [CQOI2015]任务查询系统 主席树 + 差分

传送门 题意&#xff1a; 思路&#xff1a; 题目中(si,ei,pi)(s_i,e_i,p_i)(si​,ei​,pi​)转换成操作即为在[si,ei][s_i,e_i][si​,ei​]区间内加上pip_ipi​的优先级&#xff0c;让后查询的话就是查询第xix_ixi​秒优先级最小的kik_iki​个任务的优先级之和。可知这两个操…

asp.net core 系列之Performance的 Response compression(响应压缩)

本文&#xff0c;帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正)。什么是响应压缩&#xff1f;响应压缩简单的说就是为了减少网络带宽&#xff0c;而把返回的响应压缩&#xff0c;使之体积缩小&#xff0c;从而加快响应的一种技术(个人…

CF1516E. Baby Ehab Plays with Permutations(组合数学)

CF1516E. Baby Ehab Plays with Permutations Solution 因为组合水平不行所以只弄出来一个O(k4)O(k^4)O(k4)的做法&#xff08;虽然随便改改可能就O(k3log⁡k)O(k^3\log k)O(k3logk)或者O(k3)O(k^3)O(k3)了&#xff09;而且因为没想清楚而自闭了很久&#xff0c;从而导致摸yu…

Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先一个括号序列合法的条件可以转化成两个(左括号代价为111&#xff0c;右括号代价为−1-1−1)&#xff1a; (1) 左括号个数等于右括号个数。 (2) 括号的前缀和非负。 所以我们直接用线段…

从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

前言在阅读这篇文章&#xff1a;Announcing Net Core 3 Preview3的时候&#xff0c;我看到了这样一个特性&#xff1a;Docker and cgroup memory LimitsWe concluded that the primary fix is to set a GC heap maximum significantly lower than the overall memory limit as …

CF1386C. Joker(整体二分)

CF1386C. Joker Solution 难得有一道可以整体二分的题。 有一个基本的思路是&#xff1a;考虑求出AnsiAns_iAnsi​表示最小的右端点&#xff0c;满足[1,i]∪[Ansi,m][1,i]\cup[Ans_i,m][1,i]∪[Ansi​,m]中存在奇环。 考虑到AnsiAns_iAnsi​序列是非减的&#xff0c;因此我…

asp.net core使用serilog将日志推送到腾讯云日志服务

为什么是serilog&#xff1f;Serilog是 .NET 中最著名的结构化日志类库。基于日志事件log events&#xff0c;而不是日志消息log message。你可以将日志事件格式化为控制台的可读文本或者可以将相同的事件格式化为JSON并将其发送到远程日志服务器。应用程序中的日志语句会创建L…

P5787 二分图 /【模板】线段树分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 线段树分治就是在线段树上进行遍历&#xff0c;到每个点都加上它对子节点的贡献&#xff0c;最后到叶子节点的时候算一下贡献。 对于这个题先考虑维护二分图的话&#xff0c;可以用扩展域并…