标签:end omega name 三个点 思路 == ble main style
原题题面:https://codeforces.com/contest/1293/problem/C
题目大意:
有一个2*n的图
NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点
每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过
每操作一次要回答一次NEKO#ΦωΦ能不能带领他们走到那里
解题思路:
用cnt记录不能走的种类数
两个数组,分别对应r为1和r为2
值用0和1表示能通过和不能通过
如果当前操作的是点c
如果操作完之后这个点的值变成了0(可以通过了)
那么就考虑另外一个r的数组的 c-1 c c+1 三个点的情况
如果三个点满足题意(大于等于1且小于等于n)并且点值为1(不能通过),说明这个点能和这次操作被消除的点构成一个障碍
而此时这个点变成了0,说明障碍消除了,所以不能走的种类数可以-1
总而言之,c-1 c c+1 这三个点有多少个1,拿cnt就减几
如果操作完变成了1(不能通过了)
照常,看另外一个r数组的 c-1 c c+1 这三个点有多少个1,拿cnt就加几(不能走的种类数会增加)
最后看cnt的状态
如果cnt为0则表示能走
否则不能走
1 /* 2 Written By. StelaYuri 3 On 2020/01/19 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 int a[100050],b[100050]; 8 void solve(){ 9 int n,q,i,x,y,cnt=0; 10 memset(a,0,sizeof a); 11 memset(b,0,sizeof b); 12 cin>>n>>q; 13 while(q--){ 14 cin>>x>>y; 15 if(x==1){ 16 a[y]=1-a[y]; 17 if(a[y]){ 18 if(y-1>0) 19 cnt+=b[y-1]; 20 cnt+=b[y]; 21 if(y+1<=n) 22 cnt+=b[y+1]; 23 } 24 else{ 25 if(y-1>0) 26 cnt-=b[y-1]; 27 cnt-=b[y]; 28 if(y+1<=n) 29 cnt-=b[y+1]; 30 } 31 } 32 else{ 33 b[y]=1-b[y]; 34 if(b[y]){ 35 if(y-1>0) 36 cnt+=a[y-1]; 37 cnt+=a[y]; 38 if(y+1<=n) 39 cnt+=a[y+1]; 40 } 41 else{ 42 if(y-1>0) 43 cnt-=a[y-1]; 44 cnt-=a[y]; 45 if(y+1<=n) 46 cnt-=a[y+1]; 47 } 48 } 49 cout<<(cnt==0?"Yes":"No")<<endl; 50 } 51 } 52 int main(){ 53 ios::sync_with_stdio(0); 54 cin.tie(0);cout.tie(0); 55 solve(); 56 57 return 0; 58 }
Codeforces Round #614 (Div. 2) C - NEKO's Maze Game
标签:end omega name 三个点 思路 == ble main style
原文地址:https://www.cnblogs.com/stelayuri/p/12216137.html