POJ-2777-Count Color(区间染色 统计区间颜色数目)

这是一道关于区间染色和颜色统计的算法题,板子长度为L厘米,可以进行染色和查询区间颜色数量的操作。题目要求在给定的限制条件下,对区间颜色进行计数并输出结果。解题关键在于利用区间维护状态,进行高效的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

有一块很长的板子,它的长度是L厘米,L是一个正整数,所以我们可以把板子平均分成L段,它们被标记为1,2,…L从左到右,每个都是1厘米长。现在我们要给木板上色——一段只有一种颜色。我们可以在板上做以下两个操作:
1 “C A B C”将板子从A段涂到B段的颜色为C。
2 “P A B”输出A段和B段(包括)之间绘制的不同颜色的数量。
在我们的日常生活中,我们很少有词语来描述一种颜色(红、绿、蓝、黄……),所以你可能会认为不同颜色T的总数很小。为了简单起见,我们将颜色的名称表示为颜色1、颜色2、…开始时,这块木板被涂成颜色1。剩下的问题就交给你了。

输入

第一行输入包含L (1 <= L <= 100000)、T (1 <= T <= 30)和O (1 <= O <= 100000)。这里O表示操作次数。在O行之后,每一行都包含前面定义的操作“C A B C”或“P A B”(这里的A、B、C是整数,A可能大于B)。

输出

输出结果按输出操作顺序排列,每行包含一个数字。


题解:tag上推。无颜色为0 颜色多种 或者一边有一边没有为-1。
找到一个包含cl,cr的区间而且tag[pos]!=-1,就应该return 了。tag[pos]!=0 ans++;
找到一个cl,cr包含的区间而且tag[pos]!=-1,也应该return 了。tag[pos]!=0 ans++;
pushdown 时 tag[pos]=0||tag[pos]=-1 时return;

#include<cstdio>
#include<cstring>
#include<algorithm>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
const int N=1e5+5;
int tag[N*3],vis[32],ans;
void pushdown(int pos){
   
    if(tag[pos]<=0) return;
    tag[pos<<1]=tag[pos<<1|1]=tag[pos
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值