首先,用广度优先搜索肯定会超时。
所以,考虑用树状数组。
用一个数组记录ma[i]表示第i条到第i+1条路是边通的。那么就可以计算顺里针或者逆时针1的和数是否与城市的数目相等即可。
这可以用快速求和的方法——树状数组。
#include<stdio.h>
#include<string.h>
int c[100010],ma[100010];
int lowbit(int x){
return x&(-x);
}
void insert(int k,int d,int maxs){
while(k<=maxs){
c[k] += d;
k += lowbit(k);
}
}
int getsum(int k){
int sum = 0;
while(k>0){
sum += c[k];
k-=lowbit(k);
}
return sum ;
}
int main(){
int i;
int n,m;
int f,x,y;
while(scanf("%d%d",&n,&m)!=EOF){
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
insert(i,1,n);
ma[i] = 1;
}
while(m--){
scanf("%d%d%d",&f,&x,&y);
if(x>y){int temp = x;x = y; y = temp;}
if(f == 0){
if(y==n && x == 1){
if(ma[y] == 1){
insert(y,-1,n);
ma[y] = 0;
}
else{
insert(y,1,n);
ma[y] = 1;
}
}
else{
if(ma[x] ==1){
insert(x,-1,n);
ma[x] = 0;
}
else{
insert(x,1,n);
ma[x] = 1;
}
}
}
else{
int t1,t2,t3,t4;
t1 = getsum(x-1);t2 = getsum(y-1);
int flag = 0;
if(t2 - t1 == y - x){
printf("YES\n");
flag = 1;
}
if(!flag){
t3 = getsum(n)- t2;
if(t3 + t1 == n - y + x){
printf("YES\n");
flag = 1;
}
}
if(!flag) printf("NO\n");
}
}
}
return 0;
}