ARC151D Binary Representations and Queries

题目链接:ARC151D Binary Representations and Queries

非常好思维题。

思路

首先我们会发现每个操作都是 \(\frac{n}{2}\) 的 \(A_i\),给另外 \(\frac{n}{2}\) 的 \(A_j\) 的增加。

这题直接去维护每个操作时间复杂度会开心的笑。

所以我们换个思路,先去探究一下这题的性质。

考虑一下,是否操作直接可以交换顺序?

反正我觉得不可以

现在我们来证明一下,交换操作不会对答案造成影响(这里交换的前提是要求 \(x_i\neq x_j\))。

设有操作 \(i,j\),且 \(x_i\neq x_j,i<j\)。

那么我们可以将 \(2^n\) 个下标分为 \(4\) 个集合。

1.\(b_{x_i}=y_i\) 且 \(b_{x_j}=y_j\)。

2.\(b_{x_i}=y_i\) 且 \(b_{x_j}\neq y_i\)。

3.\(b_{x_i}\neq y_i\) 且 \(b_{x_j}=y_j\)。

4.\(b_{x_i} \neq y_i\) 且 \(b_{x_j}\neq y_j\)。

这里的 \(b_i\) 表示第 \(i\) 位二进制的数。

我们将集合 \(u\) 向 \(v\) 连有向边,表示集合 \(u\) 内的下标会给 \(v\) 内的下标做贡献,边的权值为这次操作的编号。

注意这里的权值仅表示操作的编号。

  • 如果先做操作 \(i\),每个集合最终所得到的值如下:

    ​ \(2\gets 1\)。

    ​ \(3 \gets 1\)。

    ​ \(4 \gets 2+3+1\)。

  • 如果先做操作 \(j\),每个集合最终所得到的值如下:

    ​ \(2\gets 1\)。

    ​ \(3 \gets 1\)。

    ​ \(4 \gets 3+2+1\)。

不难发现,每个集合所得到的值并没有发生变化。

也就是说,只要满足 \(x_i\neq x_j\),我们是可以交换操作的。

有了这个性质,我们考虑把所有 \(x_i\) 相等的操作交换到一起操作。

这样就被分成了两个集合,这两个集合间互相给对方做贡献,方便我们快速统计每个集合收到贡献的系数。

这样就可以快速求 \(A_i\) 了。

时间复杂的 \(O(n\log n)\)。

CODE

#include<bits/stdc++.h>
using namespace std; #define ll long long
#define mod 998244353 const int maxn=3e5+5; int n,q; ll a[maxn],tmp[maxn]; vector<int>tag[20]; int main()
{
scanf("%d%d",&n,&q);
for(int i=0;i<(1<<n);i++) scanf("%lld",&a[i]);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
tag[x].push_back(y);
}
for(int i=0;i<n;i++)
{
int x_1=1,y_1=0,x_0=1,y_0=0;//x是自己对自己的贡献系数,y是对方对自己的贡献系数
for(int k:tag[i])
{
if(k) x_0=(x_0+y_1)%mod,y_0=(y_0+x_1)%mod;
else x_1=(x_1+y_0)%mod,y_1=(y_1+x_0)%mod;
}
for(int j=0;j<(1<<n);j++)
{
if((j>>i)&1) tmp[j]=(x_1*a[j]%mod+y_1*a[j^(1<<i)]%mod)%mod;
else tmp[j]=(x_0*a[j]%mod+y_0*a[j^(1<<i)]%mod)%mod;
}
for(int j=0;j<(1<<n);j++) a[j]=tmp[j];
}
for(int j=0;j<(1<<n);j++) printf("%lld ",a[j]);
}

ARC151D Binary Representations and Queries的更多相关文章

  1. [题解] Atcoder Regular Contest ARC 151 A B C D E 题解

    点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...

  2. AtCoder Regular Contest 151补题

    AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...

  3. ARC145~152 题解

    比赛标号从大到小排列 . 因为博主比较菜所以没有题解的题都是博主不会做的 /youl ARC144 以前的比赛懒得写了 . 目录 AtCoder Regular Contest 152 B. Pass ...

  4. 【Note】矩阵加速

    感谢 \(\text{tidongCrazy}\) 倾情授课. 目录 基本形式 基础习题 P1962 斐波那契数列(例题) P4838 P哥破解密码(矩阵加速) 稍微up P1397 [NOI2013 ...

  5. A. You Are Given Two Binary Strings…

    A. You Are Given Two Binary Strings… You are given two binary strings x and y, which are binary repr ...

  6. CodeForces 485C Bits[贪心 二进制]

    C. Bits time limit per test1 second memory limit per test256 megabytes inputstandard input outputsta ...

  7. LUXURY 8

    A - Gargari and Bishops Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  8. 第二十次codeforces竞技结束 #276 Div 2

    真是状况百出的一次CF啊-- 终于还Unrated了,你让半夜打cf 的我们怎样释怀(中途茫茫多的人都退场了)--虽说打得也不好-- 在这里写一下这一场codeforces的解题报告.A-E的 题目及 ...

  9. USD词汇表(USD Glossary)

    这篇文章是在学习USD的过程中龟速写成的,目的是将USD的核心设计.相关概念的说明.以及配套API整理出来,为后续进行的USD开发工作提供中文资料支持. 实际上也只有充分理解了USD设计中的每一个知识 ...

  10. codeforces484A

    Bits CodeForces - 484A Let's denote as  the number of bits set ('1' bits) in the binary representati ...

随机推荐

  1. 在 Docker 中启动 Jupyter

    参考:Jupyter Docker Stacks documentation 容器地址在 quay.io/jupyter/scipy-notebook 如果你直接运行命令: docker run -p ...

  2. 严蔚敏 数据结构 配套教材 PDF

    目录 严蔚敏 数据结构 配套教材 PDF 下载地址: 严蔚敏 数据结构 配套教材 PDF 配套教材包括: 严蔚敏<数据结构题集>(C语言版).pdf 严蔚敏<数据结构>(C语言 ...

  3. docker image 变小的办法

    https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/ https://medium.com/sciforce/st ...

  4. Redis 入门 - 简介

    Redis是Remote Dictionary Server的缩写,可以翻译成远程字典服务.Redis是用C语言编写的开源项目. Redis 最主要的特点就是高性能,对于简单的键值读取速度可以达到10 ...

  5. JavaScript – Sort

    前言 排序是很常见的需求. 虽然看似简单, 但其实暗藏杀机. 一不小心就会搞出 Bug 哦. 这篇就来聊聊 JS 的排序. 参考 原生JS数组sort()排序方法内部原理探究 值的比较 js中的loc ...

  6. PyCharm 的一些基本设置&&常用插件&&快捷键

    PyCharm一些基本设置   1.主题色彩   2.添加设置:Ctrl+鼠标滚轮上下调节字体大小           3. 中文语言包   4.翻译插件 5.快捷键

  7. YAML 文件基本语法格式(十四)

    一.YAML 文件基本语法格式 前面我们得 Kubernetes 集群已经搭建成功了,现在我们就可以在集群里面来跑我们的应用了.要在集群里面运行我们自己的应用,首先我们需要知道几个概念. 第一个当然就 ...

  8. 使用composer创建项目时报错:Composer could not find the config file?

    使用composer创建项目时报错:Composer could not find the config file:C:\Composer ....? 一般报这个错就是composer安装的时候配置了 ...

  9. USB协议详解第11讲(USB描述符-总结)

    描述符回顾总结 1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备.设备需要的总 ...

  10. 从2s优化到0.1s,我用了这5步

    前言 分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中. 但就是这样一个简单的分类树查询功能,我们却优化了5次. 到底是怎么回事呢? 背景 我们的网站使用了SpringBoot推荐的 ...