题解 | #简单题#

简单题

https://ac.nowcoder.com/acm/contest/965/E

简单题


思路

转为括号序列,左括号:区间左端点,右括号:区间右端点
t = 1 时,L 处的左括号数目加 1,R 处的右括号数目加 1
t = 2 时,令 [1,x] 区间的左括号数目 减去 [1,x-1] 区间的右括号数目 = k
k 就是 位置 x 上的元素(初始为0) 的变化次数,k 为偶数 答案为 0,否则为 1

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5+10;

int tr[N],trr[N];
int n,m;

int lowbit(int x){
    return  x & -x;
}

void add(int t[],int x,int v){
    for(int i=x;i<=n;i+=lowbit(i)) t[i]+=v;
}

int sum(int t[],int x){
    int res=0;
    for(int i=x;i;i-=lowbit(i))  res+=t[i];
    return res;
}

int query(int x){
    return sum(tr,x)-sum(trr,x-1);
}

int main(){
    cin>>n>>m;
    int t,l,r;
    while(m--){
        cin>>t;
        if(t==1) cin>>l>>r,add(tr,l,1),add(trr,r,1);
        else{
            cin>>l;
            if(query(l)&1) puts("1");
            else puts("0");
        } 
    }

    return 0;
}
全部评论

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务