社区讨论

关于变量

学术版参与者 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 值变为 00。而使用 len[o] 则没有出现这个问题。
所以请问此种现象为何出现,是否是结构体使用不规范导致。
谢谢。

回复

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

正在加载回复...