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;
}
还是菜。