\[\texttt{Description}
\]

  • 给出一个长度为 \(n\) 的数列 \(a\),求 \(\sum\limits_{i=1}\limits^{n}\sum\limits_{j=1}\limits^{n}\sum\limits_{k=1}\limits^{n}\sum\limits_{l=1}\limits^{n}(a_i \ \text{or} \ a_j) \ \text{xor} \ (a_k \ \text{and} \ a_l)\) 。

\[\texttt{Solution}
\]

  • 先考虑下普通的谔运算 \((a \ \text{or} \ b) \ \text{xor} \ (c \ \text{and} \ d)\) 什么时候为真(\(a,b,c,d \in \{ 0,1 \}\)),我们发现 \(a,b,c,d\) 一共有 \(16\) 种取值,其中有 \(10\) 种取值使得式子为真:

  • \(a = 0, b = 0, c = 1, d = 1\) ;

    \(a = 0, b = 1, c = 0, d = 0\) ;

    \(a = 0, b = 1, c = 0, d = 1\) ;

    \(a = 0, b = 1, c = 1, d = 0\) ;

    \(a = 1, b = 0, c = 0, d = 0\) ;

    \(a = 1, b = 0, c = 0, d = 1\) ;

    \(a = 1, b = 0, c = 1, d = 0\) ;

    \(a = 1, b = 1, c = 0, d = 0\) ;

    \(a = 1, b = 1, c = 0, d = 1\) ;

    \(a = 1, b = 1, c = 1, d = 0\) 。

  • 然后考虑按位分组计算贡献。

  • 详细地说:\((a \ \text{or} \ b) \ \text{xor} \ (c \ \text{and} \ d)\) 得到的数,若第 \(i\) 位为真,则对答案有 \(2^i\) 的贡献。由于谔运算是按位处理的,也就是说我们可以计算出对答案有贡献的数中,有多少个数第 \(i\) 位为真,若将这个量记为 \(c_i\) ,最后答案即为 \(\sum\limits_{i=0}\limits^{31}c_i \times 2^i\) 。

  • 我们记 \(cnt[i,j]\) 表示 \(a\) 中有多少数第 \(i\) 位为 \(j\) ,可以 \(\text{O(32n)}\) 预处理。

  • 然后按位分组计算贡献,根据乘法原理和加法原理,从 \(a\) 中选出 \(4\) 个数进行谔运算,第 \(i\) 位为真的四元组有 \(cnt[i,0] \times cnt[i,0] \times cnt[i,1] \times cnt[i,1] + cnt[i,0] \times cnt[i,1] \times cnt[i,0] \times cnt[i,0] + ......\) ,最后将其乘上 \(2^i\) 计入答案中。

  • 注意到此题的膜数为 \(2^{32}\) ,所以 ,记得要开 \(\text{unsigned} \ \text{int}\)。

  • 时间复杂度 \(\text{O(32n)}\) 。

\[\texttt{Code}
\]

#include<cstdio>
#include<iostream> #define RI register int using namespace std; namespace IO
{
static char buf[1<<20],*fs,*ft;
inline char gc()
{
if(fs==ft)
{
ft=(fs=buf)+fread(buf,1,1<<20,stdin);
if(fs==ft)return EOF;
}
return *fs++;
}
#define gc() getchar()
inline int read()
{
unsigned int x=0,f=1;char s=gc();
while(s<'0'||s>'9')s=gc();
while(s>='0'&&s<='9')x=x*10+s-'0',s=gc();
return x*f;
}
}using IO::read; const int N=500100; int n; int a[N]; unsigned int cnt[33][2]; unsigned int ans; int main()
{
n=read(); for(RI i=1;i<=n;i++)
a[i]=read(); for(RI i=1;i<=n;i++)
for(RI j=0;j<32;j++)
cnt[j][(a[i]>>j)&1]++; for(RI i=0;i<32;i++)
{
unsigned int c=0; c+=cnt[i][0]*cnt[i][0]*cnt[i][1]*cnt[i][1];
c+=cnt[i][0]*cnt[i][1]*cnt[i][0]*cnt[i][0];
c+=cnt[i][0]*cnt[i][1]*cnt[i][0]*cnt[i][1];
c+=cnt[i][0]*cnt[i][1]*cnt[i][1]*cnt[i][0];
c+=cnt[i][1]*cnt[i][0]*cnt[i][0]*cnt[i][0];
c+=cnt[i][1]*cnt[i][0]*cnt[i][0]*cnt[i][1];
c+=cnt[i][1]*cnt[i][0]*cnt[i][1]*cnt[i][0];
c+=cnt[i][1]*cnt[i][1]*cnt[i][0]*cnt[i][0];
c+=cnt[i][1]*cnt[i][1]*cnt[i][0]*cnt[i][1];
c+=cnt[i][1]*cnt[i][1]*cnt[i][1]*cnt[i][0]; ans+=c*(1<<i);
} printf("%u\n",ans); return 0;
}

\[\texttt{Thanks} \ \texttt{for} \ \texttt{watching}
\]

题解【Luogu P6102 谔运算】的更多相关文章

  1. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  2. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  3. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

  4. 题解 Luogu P1110 【[ZJOI2007]报表统计】

    感谢 @cmy962085349 提供的hack数据,已经改对了. 先声明,我好像是题解里写双$fhq$ $treap$里唯一能过的...(最后两个点啊) 思路:首先看题目,$MIN_GAP_SORT ...

  5. 题解 Luogu P3370

    讲讲这题的几种做法: 暴力匹配法 rt,暴力匹配,即把字符串存起来一位一位判相等 时间复杂度$ O(n^2·m) $ 再看看数据范围 \(n\le10^5,m\le10^3\) 当场爆炸.当然有暴力分 ...

  6. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  7. [题解]luogu P4116 Qtree3

    终于来到了Qtree3, 其实这是Qtree系列中最简单的一道题,并不需要线段树, 只要树链剖分的一点思想就吼了. 对于树链剖分剖出来的每一根重链,在重链上维护一个Set就好了, 每一个Set里存的都 ...

  8. 题解 Luogu P3959 【宝藏】

    来一篇不那么慢的状压??? 话说这题根本没有紫题难度吧,数据还那么水 我是不会告诉你我被hack了 一看数据规模,n≤12,果断状压. 然后起点要枚举,就设dp状态: f[i][j]=以i为起点到j状 ...

  9. 题解 Luogu P1099 【树网的核】

    这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. ...

随机推荐

  1. Java手写数组栈

    public class ArrayStack{ private String[] items; //数组 private int count; //栈内元素 private int n; //栈大小 ...

  2. 0182 JavaScript执行机制:单线程,同步任务和异步任务,执行栈,消息队列,事件循环

    以下代码执行的结果是什么? [结果是1 2 3 ] console.log(1); setTimeout(function () { console.log(3); }, 1000); console ...

  3. WebStorm安装和激活

    1.下载解压,得到jetbrains webstorm 2018.2主程序,破解文件和中文语言包: 2.运行“WebStorm-2018.2.exe”开始安装,默认安装目录[C:\Program Fi ...

  4. ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)

    目录 1 PostgreSQL 11.0安装及配置 2 psqlODBC安装及配置 3 PostGIS安装及配置 4 pgAdmin4使用入门 5 空间数据导入 5.1 将PostgreSQL的bin ...

  5. Java 第一次课堂测验

    周一下午进行了开学来java第一次课堂测验,在课堂上我只完成了其中一部分,现代码修改如下: 先定义 ScoreInformation 类记录学生信息: /** * 信1805-1 * 胡一鸣 * 20 ...

  6. 5、调试显示应该使用 DebuggerDisplay 而不是误用 ToString

    using System.Diagnostics; namespace ShouldCode.Console { [DebuggerDisplay("Prop1:{Prop1};Prop2: ...

  7. 序列积第m小元素 二分答案优化

    给出两个长度为n的数组A和B, 在A和B中各任取一个, 可以得到n×n个积. 求第m小的元素. n<=100000 这一道题的意思就是 a1 a2 a3 a4.. b1 b2 b3 b4 n^2 ...

  8. H5录音音频可视化-实时波形频谱绘制、频率直方图

    这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面 ...

  9. spark storm 反压

    因特殊业务场景,如大促.秒杀活动与突发热点事情等业务流量在短时间内剧增,形成巨大的流量毛刺,数据流入的速度远高于数据处理的速度,对流处理系统构成巨大的负载压力,如果不能正确处理,可能导致集群资源耗尽最 ...

  10. RabbitMQ入门(二)工作队列

      在文章RabbitMQ入门(一)之Hello World,我们编写程序通过指定的队列来发送和接受消息.在本文中,我们将会创建工作队列(Work Queue),通过多个workers来分配耗时任务. ...