求助 建颜色数棵线段树分别维护每种颜色 全WA
查看原帖
求助 建颜色数棵线段树分别维护每种颜色 全WA
49677
miserExist楼主2021/10/12 08:33

每种一颗,动态开点

看了好久不太知道哪里错了

初始化全1好像没效果,错的地方大多只差1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 4e5 + 10;
struct seg
{
	int ls, rs;
	int sum, tag;
	seg()
	{
		sum = 0, tag = 0;
	}
}tr[N << 2];
int n,col,m,cnt;
int root[N];
void pushup(int u)
{
	tr[u].sum = max(tr[tr[u].ls].sum, tr[tr[u].rs].sum);
}
void pushdown(int u)
{
	if(tr[u].tag != 0)
	{
		tr[tr[u].ls].tag = tr[tr[u].rs].tag = tr[u].tag;
		if(tr[u].tag == -1)
		{
			tr[tr[u].ls].sum = tr[tr[u].rs].sum = 0;
		}
		else if(tr[u].tag != -1)
		{
			tr[tr[u].ls].sum = tr[tr[u].rs].sum = 1;
		}
	}
	tr[u].tag = 0;
}
void modify(int &p, int l, int r, int x, int y, int k)
{
	if(!p) p = ++ cnt;
	if(l >= x && r <= y)
	{
		tr[p].tag = k;
		if(k == -1)
			tr[p].sum = 0;
		else if(k != -1) 
			tr[p].sum = 1;
		return;
	}
	pushdown(p);
	int mid = l + r >> 1;
	if(x <= mid) modify(tr[p].ls, l, mid, x, y, k);
	if(y > mid) modify(tr[p].rs, mid + 1, r, x, y, k);
	pushup(p);
}
int query(int p, int l, int r, int x, int y)
{
	if(!p) return 0;
	if(l >= x && r <= y)
	{
		return tr[p].sum;
	}
	pushdown(p);
	int mid = l + r >> 1;
	int maxx = 0;
	if(x <= mid) maxx = max(maxx, query(tr[p].ls, l, mid, x, y));
	if(y > mid) maxx = max(maxx, query(tr[p].rs, mid + 1, r, x, y));
	//pushup(p);
	return maxx;
}

signed main()
{
	//freopen("1558.in","r",stdin);
	//freopen("1558.out","w",stdout);
	cin >> n >> col >> m;
	modify(root[1], 1, n, 1, n, 1);
	while(m --)
	{
		char op[3];
		scanf("%s", op);
		if(op[0] == 'C')
		{
			int l, r, k;
			scanf("%d%d%d", &l, &r, &k);
			if(l > r) swap(l, r);
			for(int i = 1; i <= col; i ++)
			{
				modify(root[i], 1, n, l, r, -1);
			}
			modify(root[k], 1, n, l, r, k);
		}
		else if(op[0] == 'P')
		{
			int l, r;
			scanf("%d%d", &l, &r);
			int sum = 0;
			if(l > r) swap(l, r);
			for(int i = 1; i <= col; i ++)
			{
				sum += query(root[i], 1, n, l, r);
			}
			printf("%d\n", sum);
		}
	}
	
	
	
	return 0;
}

2021/10/12 08:33
加载中...