ARC151D Binary Representations and Queries
ARC151D Binary Representations and Queries
题目链接:ARC151D Binary Representations and Queries
非常好思维题。
思路
首先我们会发现每个操作都是
这题直接去维护每个操作时间复杂度会开心的笑。
所以我们换个思路,先去探究一下这题的性质。
考虑一下,是否操作直接可以交换顺序?
反正我觉得不可以
现在我们来证明一下,交换操作不会对答案造成影响(这里交换的前提是要求
设有操作
那么我们可以将
1.
2.
3.
4.
这里的
我们将集合
注意这里的权值仅表示操作的编号。
-
如果先做操作
,每个集合最终所得到的值如下:
。
。
。 -
如果先做操作
,每个集合最终所得到的值如下:
。
。
。
不难发现,每个集合所得到的值并没有发生变化。
也就是说,只要满足
有了这个性质,我们考虑把所有
这样就被分成了两个集合,这两个集合间互相给对方做贡献,方便我们快速统计每个集合收到贡献的系数。
这样就可以快速求
时间复杂的
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]);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现