玄学WA, 本蒟蒻无法理解
查看原帖
玄学WA, 本蒟蒻无法理解
292801
zhong0204楼主2021/8/19 15:04

那么水一道线段树, 然而我却WA的彻底。

测试点一

我 :

0
1
1
2

评测姬 : Wrong Answer.

wrong answer On line 1 column 1, read 1, expected 0.

测试数据 : 你是对的

P2574_1.in
10 5
1001010110
1 2 3
0 6 9
1 7 10
1 2 5
1 2 7

P2574_1.out
0
1
1
2

评测姬 : 就不给你AC

我 :……

我 :信不信我找大佬治你

现在蒟蒻把这个问题交给了你, 并希望你尽快解决。为了更好让你发 蒟蒻的问题, ta 把 ta 的代码给了你

//平凡而显然的线段树
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <fstream>
using namespace std;
#define ls(p) p<<1
#define rs(p) p<<1|1
#define rev(p) tr[p].rev
#define sum0(p) tr[p].sum[0]
#define sum1(p) tr[p].sum[1]
#define M 200010

template <typename T> inline void read(T &x){
    int f=1; x=0; char c = getchar();
    for(;!isdigit(c); c = getchar()) if(c == '-') f=-f;
    for(; isdigit(c); c = getchar()) x = x*10+c-'0';
    x *= f; return ;
}

struct stree{
    int sum[2], rev;
}tr[M<<2];

inline void pushup(int p){
    sum1(p) = sum1(ls(p)) + sum1(rs(p));
    sum0(p) = sum0(ls(p)) + sum0(rs(p));
    return ;
}

int a[M];
inline void build(int p, int l, int r){
    sum1(p) = sum0(p) = rev(p) = 0;
    if(l == r){
        tr[p].sum[a[l]] = 1;
//      cout<<a[l]<< " "<<tr[p].sum[a[l]]<<endl;
        return ;
    }
    int mid = (l + r) >> 1;
    build(ls(p), l, mid);
    build(rs(p), mid+1, r);
    pushup(p);
    return ;
}

inline void pushdown(int p){
    if(!rev(p)) return ;
    rev(ls(p)) ^= 1;
    rev(rs(p)) ^= 1;
    rev(p) ^= 1;
    swap(sum1(ls(p)), sum0(ls(p)));
    swap(sum1(rs(p)), sum0(rs(p)));
    return ;
}

inline void update(int p, int l, int r, int x, int y){
    if(x <= l && r <= y){
        rev(p) ^= 1;
        swap(sum1(p), sum0(p));
        return ;
    }
    pushdown(p);
    int mid = (l + r) >> 1;
    if(x <= mid) update(ls(p), l, mid, x, y);
    if(y > mid) update(rs(p), mid+1, r, x, y);
    pushup(p);
    return ;
}

inline int query(int p, int l, int r, int x, int y){
    if(x <= l && r <= y)
        return sum1(p);
    pushdown(p);
    int mid = (l + r) >> 1;
    int t1 = 0, t2 = 0;
    if(x <= mid) t1 = query(ls(p), l, mid, x, y);
    if(y > mid) t2 = query(rs(p), mid+1, r, x, y);
    return t1 + t2;
}

int n, m;
signed main(){
//  freopen("P2574.in", "r", stdin);
//  freopen("ans.out", "w", stdout); 
    read(n), read(m);
    for(int i=1; i<=n; i++){
        int x = getchar();
        a[i] = x - '0';
    }
    build(1, 1, n);
//  for(int i=1; i<=n; i++)
//      printf("%d ", query(1, 1, n, i, i));
//  printf("\n");
    for(int i=1; i<=m; i++){
        int op, l, r;
        read(op), read(l), read(r);
        if(op) printf("%d\n", query(1, 1, n, l, r));
        else update(1, 1, n, l, r);
//      for(int i=1; i<=n; i++)
//          printf("%d ", query(1, 1, n, i, i));
//      printf("\n");
    }
    return 0;
}
2021/8/19 15:04
加载中...