c++11 结构体定义时赋初始值,洛谷会爆MLE,本地不会
  • 板块P2574 XOR的艺术
  • 楼主Moota
  • 当前回复11
  • 已保存回复11
  • 发布时间2021/1/27 15:12
  • 上次更新2023/11/5 04:18:51
查看原帖
c++11 结构体定义时赋初始值,洛谷会爆MLE,本地不会
355055
Moota楼主2021/1/27 15:12

如题

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <queue>
#include <stack>
#define lld long long int
#define ls(k) (k)<<1
#define rs(k) (k)<<1|1
using namespace std;
const int MAXN = int(2 * 10e5);
inline void Init() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}
inline int Read()
{
    char ch = getchar(); int x = 0, f = 1;
    while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
lld n, m;
int a[MAXN];
struct {
    lld l, r;
    lld sum, times;
    lld i=1 ;
}t[4*MAXN+5];
void Build(int i, int l, int r) {
    t[i].l = l, t[i].r = r;
    if (l == r) {  
        t[i].i = 1;
        t[i].sum = (a[l] == 1 ? 1 : 0);
        return;
    }
    int  mid = (l + r) / 2;
    Build(i * 2, l, mid);
    Build(i * 2 + 1, mid + 1, r);
    t[i].sum = t[i * 2].sum + t[i * 2 + 1].sum;
    t[i].i = t[i * 2].i + t[i * 2 + 1].i;
}
void Spread(int i) {
    if (t[i].times) {
        t[i * 2].sum = (t[i].times % 2 == 0 ? t[i * 2].sum : t[i * 2].i - t[i * 2].sum);
        t[i * 2 + 1].sum = (t[i].times % 2 == 0 ? t[i * 2 + 1].sum : t[i * 2 + 1].i - t[i * 2 + 1].sum);
        t[i * 2].times+=t[i].times;
        t[i * 2 + 1].times += t[i].times;
        t[i].times = 0;
    }
}
void Add(int i,int l,int r) {
    if (l <= t[i].l && t[i].r <= r) {
        t[i].times++;
        t[i].sum = t[i].i - t[i].sum;
        return;
    }
    Spread(i);
    int mid = (t[i].l + t[i].r) / 2;
    if (l <= mid)Add(i * 2, l, r);
    if (mid < r)Add(i * 2 + 1, l, r);
    t[i].sum = t[i * 2].sum + t[i * 2 + 1].sum;
}
int Find(int i, int l, int r) {
    if (l <= t[i].l && t[i].r <= r) {
        return   t[i].sum;
    }
    Spread(i);
    int ans = 0;
    int mid = (t[i].l + t[i].r) / 2;
    if (l <= mid)ans += Find(i * 2, l, r);
    if (mid < r)ans += Find(i * 2 + 1, l, r);
    return ans;
}
int main()
{
    Init();
    cin >> n >> m;
    char ch;
    for (int i = 1; i <= 4 * n; ++i) {
        t[i].i = 1;
    }
    for (int i = 1; i <= n; ++i) {
        cin >> ch;
        if (ch == '1')
            a[i] = 1;
        else
            a[i] = 0;
    }
    Build(1, 1, n);
    int o, l, r;
    while (m--) {
        cin >> o >> l >> r;
        if (o == 0) {
            Add(1, l, r);
            //反转次数++
        }
        else {
            cout << Find(1, l, r) << "\n";
            //统计
        }   
    }
    return 0;
}

2021/1/27 15:12
加载中...