求助
  • 板块P1558 色板游戏
  • 楼主xz001
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/16 09:23
  • 上次更新2023/11/2 13:30:28
查看原帖
求助
674967
xz001楼主2023/10/16 09:23

样例过不了,找不出错,求助大佬:

#include<bits/stdc++.h>
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define fa(x) ((x)>>1)
using namespace std;

const int N = 100005;

struct node{
	bool sum;
	bool mul, add;
}; 

struct tree {
	node t[4 * N];
	
	inline void push_up (int p) {
		t[p].sum = t[ls(p)].sum + t[rs(p)].sum; 
		return;
	}
	
	inline void build (int l, int r, int p) {
		t[p].mul = 1;
		if (l == r) {
			return;
		}
		int mid = l + r >> 1;
		build (l, mid, ls(p));
		build (mid + 1, r, rs(p));
		return;
	}
	
	inline void lazy_tag (int p, int len, bool mul, bool add) {
		t[p].sum *= mul;
		t[p].mul *= mul;
		t[p].add *= mul;
		
		t[p].sum += len * add;
		t[p].add += add;
		return;
	}
	
	inline void push_down (int p, int l, int r) {
		int mid = l + r >> 1;
		lazy_tag (ls(p), mid - l + 1, t[p].mul, t[p].add);
		lazy_tag (rs(p), r - mid, t[p].mul, t[p].add);
		t[p].add = 0;
		t[p].mul = 1;
		return;
	}
	
	inline void update (int l, int r, int L, int R, int p, bool mul, bool add) {
		if (l <= L && R <= r) {
			lazy_tag (p, r - l + 1, mul, add);
			return;
		}
		push_down(p, l, r);
		int mid = L + R >> 1;
		if (l <= mid) update (l, r, L, mid, ls(p), mul, add);
		if (r > mid) update (l, r, mid + 1, R, rs(p), mul, add);
		push_up(p);
		return;
	}
	
	inline bool query (int l, int r, int L, int R, int p) {
		if (l <= L && R <= r) {
			return t[p].sum;
		}
		push_down(p, l, r);
		int mid = L + R >> 1;
		bool sum = 0;
		if (l <= mid) sum += query (l, r, L, mid, ls(p));
		if (r > mid) sum += query (l, r, mid + 1, R, rs(p));
		return sum;
	}
};

tree t[31];

int L, T, O;

signed main() {
	scanf("%d%d%d", &L, &T, &O);
	for (int i = 1; i <= T; ++ i) t[i].build(1, L, 1);
	t[1].update(1, L, 1, L, 1, 0, 1);
	while (O -- ) {
		char op[2];
		scanf("%s", op);
		if (op[0] == 'C') {
			int A, B, C;
			scanf("%d%d%d", &A, &B, &C);
			if (A > B) swap(A, B);
			for (int i = 1; i <= T; ++ i) t[i].update (A, B, 1, L, 1, 0, 0);
			t[C].update (A, B, 1, L, 1, 0, 1);
		} else {
			int A, B;
			scanf("%d%d", &A, &B);
			if (A > B) swap(A, B);
			int sum = 0;
			for (int i = 1; i <= T; ++ i) sum += t[i].query(A, B, 1, L, 1);
			printf("%d\n", sum); 
		}
	}
	return 0;
}
2023/10/16 09:23
加载中...