标签:结论 cnt xor int 题解 while Maze NEKO getchar
有一个结论:
当 \((1,1)\) 不能抵达 \((2,n)\) 时,必定存在一个点对,这两个点的值均为真,且坐标中的 \(x\) 互异,\(y\) 的差 \(\leq 1\)
这个结论的正确性感觉非常显然,就不多说了。
下图可以形象地解释点对的位置关系。
那对于每个点的值,只要开一个数组 f[i][j]
记录一下即可。
有了上述结论,我们记一个变量 \(cnt\) 表示 " 有多少对满足上述结论的点对 " ,则 \(cnt=0\) 时,\((1,1)\) 可以抵达 \((2,n)\) ,反之不可抵达。重点在于如何维护 \(cnt\) 。
对于每次反转的点 \((x,y)\) ,我们都需要往 \(cnt\) 里 扣除 \(/\) 补上 \((x,y)\) 的贡献,具体的:(为了方便异或 \(x\) 从 \(0\) 到 \(1\)
若 \(f[x][y]=1\) ,令 \(cnt-=f[x \ xor \ 1][y-1]+f[x \ xor \ 1][y]+f[x \ xor \ 1][y+1]\),\(f[x][y]=0\)
若 \(f[x][y]=0\) ,令 \(cnt+=f[x \ xor \ 1][y-1]+f[x \ xor \ 1][y]+f[x \ xor \ 1][y+1]\),\(f[x][y]=1\)
这样就可以起到维护 \(cnt\) 的效果了,时间复杂度 \(O(n)\) 。
Code 部分
#include<cstdio>
#define RI rgeister int
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
const int N=100100;
int n,q;
int f[2][N];
int cnt;
int main()
{
n=read(),q=read();
while(q--)
{
int x=read()-1,y=read();
switch(f[x][y])
{
case 1:{
cnt-=f[x^1][y-1]+f[x^1][y]+f[x^1][y+1];
f[x][y]=0;
break;
}
case 0:{
cnt+=f[x^1][y-1]+f[x^1][y]+f[x^1][y+1];
f[x][y]=1;
break;
}
}
puts(!cnt?"Yes":"No");
}
return 0;
}
\[ thanks \ for \ watching \]
标签:结论,cnt,xor,int,题解,while,Maze,NEKO,getchar 来源: https://www.cnblogs.com/cjtcalc/p/12216571.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。