9月笔记
距离入门acm已经很久很久了
那些善良的人、美好的事都到哪里去了呢
走到了今天才发现初心已经渐渐变了
保持纯真的确是一种无人警醒的罪
但是我很离经叛道
选择了绕路而行
虽然更远但是我想让今后并不会只有后悔
希望还有微风 能够摇撼我心
9-22
CF 1629E Problem - E - Codeforces (Unofficial mirror by Menci)
这是一个相当有趣的构造trick
由于异或和的性质,在一个含有五个格子的十字形中,只要知道了其中四个,就能求出另外一个(当然是在这道题的题意下)。
去学习了一下怎么在博客里插入图(如下)

图画的不好看,但是大概能让读者明白一个意思。
C代表的是输入的a矩阵中的值,ABDE则是我们要构造的矩阵中的值。
重点在这,假设我们已经求好了BCD所在的行以及前面的几行(没错,当然是从上往下构造,顺便一提,第一行我们使得全部都为0,这是一种当条件不够时,值得注意的有趣的策略),当我们需要求E的值,有柿子
C=A^B^D^E
经过如下变换(柿子变换过程很长,因为作者很絮叨,想提高易读性,希望每一个看了这篇题解的人,都不需要再额外看别的题解,就能AC!)
C^E=A^B^D^E^E
C^E=A^B^D^(E^E)
C^E=A^B^D^0
C^E=A^B^D
C^C^E=A^B^D^C
(C^C)^E=A^B^D^C
0^E=A^B^D^C
E=A^B^D^C
整理后
E=A^B^C^D
由于上述说过的ABCD均已知
那么我们就求出了E!!!!
AC了2300分的题,还混了洛谷一个蓝题,作者开心炸了(因为作者只有绿名233)
代码:
#include<bits/stdc++.h>
#define int long long
#define rep(i,x,n) for(int i=x;i<=n;i++)
using namespace std;
const int N = 1e3+10;
int t,n;
int a[N][N],b[N][N];
main()
{
ios::sync_with_stdio(false);cin.tie(0);
for(cin >> t;t--;)
{
memset(b,0,sizeof b);
cin >> n;
rep(i,1,n) rep(j,1,n) cin >> a[i][j];
rep(i,2,n) rep(j,1,n) b[i][j]=a[i-1][j]^b[i-1][j-1]^b[i-1][j+1]^b[i-2][j];
int ans=0;
rep(i,1,n) rep(j,1,n) ans^=b[i][j];
cout << ans << "\n";
}
}
9-23
CF1631 Problem - D - Codeforces (Unofficial mirror by Menci)
非常巧妙的做法
感悟是,确实要从性质出发,而不是寻找既有套路

浙公网安备 33010602011771号