社区讨论
17pts,求调
P2894[USACO08FEB] Hotel G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mits8cxb
- 此快照首次捕获于
- 2025/12/06 12:17 3 个月前
- 此快照最后确认于
- 2025/12/06 15:57 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct node {
int lsum, rsum, sum, len;
} tree[400005];
int tag[400005];
node operator+(node a, node b) {
int lsum = 0, rsum = 0, sum = 0, len = a.len + b.len;
lsum = a.lsum;
rsum = b.rsum;
sum = max({a.sum, b.sum, a.rsum + b.lsum});
if (a.lsum == a.len) {
lsum = a.len + b.lsum;
}
if (b.rsum == b.len) {
rsum = b.len + a.rsum;
}
return {lsum, rsum, sum, len};
}
int n, m;
void build(int id, int l, int r) {
if (l == r) {
tree[id] = {1, 1, 1, 1};
return ;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
void push(int id, int l, int r) {
if (tag[id] != -1) {
if(tag[id]==0){
tree[id*2]={0,0,0,tree[id*2].len};
tree[id*2+1]={0,0,0,tree[id*2+1].len};
tag[id*2]=tag[id];
tag[id*2+1]=tag[id];
}else{
tree[id*2]={tree[id*2].len,tree[id*2].len,tree[id*2].len,tree[id*2].len};
tree[id*2+1]={tree[id*2+1].len,tree[id*2+1].len,tree[id*2+1].len,tree[id*2+1].len};
tag[id*2]=tag[id];
tag[id*2+1]=tag[id];
}
tag[id] = -1;
}
}
void up(int id, int l, int r, int ql, int qr, int val) {
if (ql <= l && r <= qr) {
tree[id] = {(r - l + 1)*val, (r - l + 1)*val, (r - l + 1)*val, tree[id].len};
tag[id] = val;
return ;
}
push(id, l, r);
int mid = (l + r) >> 1;
if (ql <= mid)up(id * 2, l, mid, ql, qr, val);
if (qr > mid)up(id * 2 + 1, mid + 1, r, ql, qr, val);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
int query(int id, int l, int r, int x) {
if (l == r) {
return l;
}
push(id, l, r);
int mid = (l + r) >> 1;
if (tree[id * 2].sum >= x) {
return query(id * 2, l, mid, x);
} else if (tree[id * 2].rsum + tree[id * 2 + 1].lsum >= x) {
return mid - tree[id * 2].rsum + 1;
} else if (tree[id * 2 + 1].sum >= x) {
return query(id * 2 + 1, mid + 1, r, x);
}
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
for (int i = 1; i <= 400000; i++) {
tag[i] = -1;
}
cin >> n >> m;
build(1, 1, n);
while (m--) {
int q, x, y;
cin >> q >> x;
if (q == 1) {
int ans = query(1, 1, n, x);
up(1, 1, n, ans, ans + x - 1, 0);
cout << ans << "\n";
} else {
cin >> y;
up(1, 1, n, x, x + y - 1, 1);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...