LG8891

题意

给定一个长度为 \(n\) 的序列 \(a\)下标从 \(1\) 开始\(m\) 次操作,每次操作给定 \(x\)\(y\),将所有满足 \(i \oplus x = 0\)\(a_i\)\(y\)\(m\) 次操作后输出序列 \(a\)

思路

要使得 \(i \oplus x = 0\),即要使这两个数的二进制位全部都一样(根据异或的规则),则这两个数相等。所以题意转化为每次给定 \(x\)\(y\),将 \(a_x\) 减去 \(y\)

注意,\(x\) 可能为 \(0\),所以要先特判 \(x\) 是否为 \(0\),不是则做减法,否则不做任何操作(下标不为 \(0\))。

序列 \(a\) 的数组要开 long long,不然会爆。

然后这题就愉快地 AC 了。

Code

#include <iostream>
#include <cstdio>
using namespace std;
int n,m,x,y;
long long a[1000001];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	for(int i=1;i<=m;i++)
	{
		x=read(),y=read();
		if(x!=0) a[x]-=y;
	}
	for(int i=1;i<=n;i++)
		printf("%lld ",a[i]);
	return 0;
}
posted @ 2024-01-20 17:52  liyilang2021  阅读(3)  评论(0编辑  收藏  举报