跳到主要内容
原文128 词数1 分钟

题解:CF2096D Wonderful Lightbulbs

概述

给定若干次点灯操作后所有亮灯的坐标,要还原隐藏的宝藏位置。每次操作让相邻两列与相邻两条斜线各变动偶数个灯,奇偶性保持不变,唯有宝藏所在的列和斜线亮灯数为奇数。于是把每盏灯的列坐标以及行列之和分别异或起来,出现奇数次的取值即对应宝藏的行与列,线性时间即可求出。

解题思路​

注意到,每次操作让 xx 和 x+1x+1 两列,以及 x+yx+y 和 x+y+1x+y+1 两条斜线,各变动 22 个灯,奇偶性保持不变,而宝藏所在的列和斜线亮灯数为奇数。

在一组出现偶数次的数中找到出现奇数次的数,可以使用异或直接求出 ss 和 tt。

参考代码​

298 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
ll a=0,b=0;
while(n--)
{
ll x,y;
cin>>x>>y;
a^=x;b^=x+y;
}
cout<<a<<' '<<b-a<<'\n';
}
return 0;
}