본문 바로가기

baekjoon

1395번 스위치

https://www.acmicpc.net/problem/1395

 

1395번: 스위치

첫 줄에는 스위치의 개수 N(2 ≤ N ≤ 100,000)과 처리할 일의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에 대해 각 줄에 처리할 일에 대한 정보가 담겨진 세 개의 정수 O, Si, Ti가 입력된다. O

www.acmicpc.net

lazy propataion문제이다. 구간을 갱신할 때 tree[node] = (end - start + 1) - tree[node]를 하면 뒤집는 거와 똑같은 역할을 한다.

 

#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define INF 2e9
#define F first
#define S second
using namespace std;

typedef long long l;
typedef pair<int,int> p;
typedef tuple<int,int,int> tu;
typedef vector<bool> vc;

int tree[100001*4];
bool lazy[100001*4];

void pg(int st,int en,int node){
    if(lazy[node]){
        tree[node] = (en - st + 1) - tree[node];

        if(st != en)  lazy[node*2] = !lazy[node*2],lazy[node*2+1] = !lazy[node*2+1];

        lazy[node] = false;
    }
}
int Cnt(int st,int en,int node,int L,int R){
    pg(st,en,node);

    if(R < st || L > en) return 0;
    if(L <= st && en <= R) return tree[node];

    int mid = (st + en) / 2;

    return Cnt(st,mid,node*2,L,R) + Cnt(mid+1,en,node*2+1,L,R);
}

void Reverse(int st,int en,int node,int L,int R){
    pg(st,en,node);
    if(R < st || L > en) return;
    if(L <= st && en <= R){
        tree[node] = (en - st + 1) - tree[node];

        if(st != en) lazy[node*2] = !lazy[node*2],lazy[node*2+1] = !lazy[node*2+1];

        return;
    }

    int mid = (st + en) / 2;

    Reverse(st,mid,node*2,L,R);
    Reverse(mid+1,en,node*2+1,L,R);

    tree[node] = tree[node*2] + tree[node*2+1];
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    int n,m,o,s,t;

    cin >> n >> m;

    while(m--){
        cin >> o >> s >> t;

        if(!o)  Reverse(0,n-1,1,s-1,t-1);
        else cout << Cnt(0,n-1,1,s-1,t-1) << "\n";
    }
}

 

'baekjoon' 카테고리의 다른 글

3197번 백조의 호수  (0) 2022.04.21
1043번 거짓말  (0) 2022.04.19
3078번 좋은 친구  (0) 2022.04.16
16496번 큰 수 만들기  (0) 2022.04.15
12844번 XOR  (0) 2022.04.15