社区讨论
关于变量
学术版参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo8qf47t
- 此快照首次捕获于
- 2023/10/27 22:52 2 年前
- 此快照最后确认于
- 2023/10/27 22:52 2 年前
RT.
在 P2824 [HEOI2016/TJOI2016]排序 中,我的代码如下:
CPP#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <random>
#include <bitset>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
namespace fastIO {
template<typename T> inline void in(T &s) {
int f = 1; char c = getchar(); s = 0;
while (!isdigit(c)) { if (c == '-') f = -f; c = getchar(); }
while (isdigit(c)) s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
if (f < 0) s = -s;
}
template<typename T> inline void out(T s) {
if (s < 0) putchar('-'), s = -s;
if (s > 9) out(s / 10);
putchar('0' + s % 10);
}
} using namespace fastIO;
using namespace std;
const int N = 1e5 + 5;
struct node {
int s, t;
node (int _s = 0) : s(_s), t(-1) {}
} t[N << 2];
/*
struct node {
int s, t, len;
node (int _s = 0) : s(_s), t(-1) {}
} t[N << 2];
*/ (1)
int len[N << 2]; // (2)
int n, m, p, a[N];
int l[N], r[N], op[N];
void pushup(int o) {
const int ls = o << 1, rs = o << 1 | 1;
t[o].s = t[ls].s + t[rs].s;
}
void pushdown(int o) {
if (t[o].t != -1) {
const int ls = o << 1, rs = o << 1 | 1;
t[ls].t = t[o].t;
t[ls].s = t[o].t * len[ls];
t[rs].t = t[o].t;
t[rs].s = t[o].t * len[rs];
t[o].t = -1;
}
}
void build(int o, int l, int r, int k) {
len[o] = r - l + 1;
t[o].t = -1;
if (l == r) {
t[o] = node((int)(a[l] >= k));
return ;
}
int mid = (l + r) >> 1;
build(o << 1, l, mid, k);
build(o << 1 | 1, mid + 1, r, k);
pushup(o);
}
int query(int o, int l, int r, int u, int v) {
if (u <= l && r <= v)
return t[o].s;
pushdown(o);
int mid = (l + r) >> 1, ans = 0;
if (u <= mid)
ans += query(o << 1, l, mid, u, v);
if (v > mid)
ans += query(o << 1 | 1, mid + 1, r, u, v);
pushup(o);
return ans;
}
void modify(int o, int l, int r, int u, int v, int w) {
if (u > v)
return ;
if (u <= l && r <= v) {
t[o].t = w;
t[o].s = w * len[o];
// (3)
return ;
}
pushdown(o);
int mid = (l + r) >> 1;
if (u <= mid)
modify(o << 1, l, mid, u, v, w);
if (v > mid)
modify(o << 1 | 1, mid + 1, r, u, v, w);
pushup(o);
}
void trip(int o, int l, int r) {
if (l == r) {
cout << t[o].s << " ";
return ;
}
pushdown(o);
int mid = (l + r) >> 1;
trip(o << 1, l, mid);
trip(o << 1 | 1, mid + 1, r);
pushup(o);
}
int check(int k) {
build(1, 1, n, k);
for (int i = 1; i <= m; ++i) {
int cnt = query(1, 1, n, l[i], r[i]);
if (op[i]) {
modify(1, 1, n, l[i], l[i] + cnt - 1, 1);
modify(1, 1, n, l[i] + cnt, r[i], 0);
} else {
modify(1, 1, n, l[i], r[i] - cnt, 0);
modify(1, 1, n, r[i] - cnt + 1, r[i], 1);
}
}
return query(1, 1, n, p, p);
}
int main() {
in(n), in(m);
for (int i = 1; i <= n; ++i)
in(a[i]);
for (int i = 1; i <= m; ++i)
in(op[i]), in(l[i]), in(r[i]);
in(p);
int L = 1, R = n, ans = 0;
while (L <= R) {
int mid = (L + R) >> 1;
if (check(mid)) {
ans = mid;
L = mid + 1;
} else R = mid - 1;
}
cout << ans << endl;
return 0;
}
注意到 (1) 处的结构体,其中的
len 与 (2) 处的 len 数组的用处是一样的,当我在使用 (1) 处的写法时(相当于把代码中的 len[o] 全部替换为 t[o].len),调用一次 modify 后,在 (3) 处调试输出,发现 t[o].len 值变为 。而使用 len[o] 则没有出现这个问题。所以请问此种现象为何出现,是否是结构体使用不规范导致。
谢谢。
回复
共 5 条回复,欢迎继续交流。
正在加载回复...