社区讨论

线段树求助

P9343一曲新词酒一杯参与者 6已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo2i8sne
此快照首次捕获于
2023/10/23 14:16
2 年前
此快照最后确认于
2023/10/23 14:16
2 年前
查看原帖
C
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
int n, m, T;
struct node {
    int l, r;
    int sum;
}tr[4 * N];

void build(int id, int l, int r) {
    tr[id] = {l, r, 0};
    if(l == r) return ;
    int mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
}

void add(int id, int l, int r) {
    if(l > r) return ;
    if(tr[id].l >= l && tr[id].r <= r) {
        tr[id].sum = tr[id].r - tr[id].l + 1;
        return ;
    }
    int mid = (tr[id].l + tr[id].r) >> 1;
    if(l <= mid) add(id << 1, l, r);
    if(r > mid) add(id << 1 | 1, l, r);
    tr[id].sum = tr[id << 1].sum + tr[id << 1 | 1].sum;
}

int main() {
    cin >> T;
    while(T --) {
        cin >> n >> m;
        build(1, 1, n);
        bool can = false;
        for(int i = 1; i <= m; i ++) {
            int op, x;
            cin >> op >> x;
            if(op == 1) {
                add(1, x, x);
            } else {
                add(1, 1, x - 1);
                add(1, x + 1, n);
            }
            if(tr[1].sum == n) {
                cout << i << endl;
                can = true;
                break;
            }
        }
        if(!can) cout << -1 << endl;
    }
    return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...