人工湖工路

点击打开链接


首先,用广度优先搜索肯定会超时。

所以,考虑用树状数组。


用一个数组记录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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值