poj2777(线段树)
题目链接:https://vjudge.net/problem/POJ-2777
题意:有L块连续的板子,每块板子最多染一种颜色,有T种(<=30)颜色,刚开始将所有板子染成颜色1,O次操作(包括将[a,b]染成颜色k,和询问[a,b]的不同颜色数),输出每次询问的值。
思路:典型的线段树的题目。用线段树实现表示一段区间的颜色值。线段树结点的属性包括l(区间左端点),r(区间右端点),value(区间的颜色值,1..T表示对应的颜色,0表示多种颜色),lazy(懒惰标记,如果不用lazy直接用value同时表示颜色值和懒惰标记会超时,因为将value作为懒惰标记时下放操作会将value置0,每次query几乎都要访问到每个叶子结点,复杂度为O(n),整个程序复杂度为(O^2))。每次query可以通过vis数组保存颜色i是否出现并由此记录不同颜色数,起始这里颜色数<=30就可以用二进制的为来表示颜色,不过用vis数组也不会超时,就懒得写进制方法了。
AC代码:
#include<cstdio>
using namespace std;
const int maxn=; struct node{
int l,r,value,lazy;
}tr[maxn<<]; int L,T,O,vis[],ans;
char c; void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r;
if(l==r) return;
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
} void pushdown(int v){
tr[v<<].value=tr[v<<].lazy=tr[v].lazy;
tr[v<<|].value=tr[v<<|].lazy=tr[v].lazy;
tr[v].lazy=;
} void update(int v,int l,int r,int k){
if(l<=tr[v].l&&r>=tr[v].r){
tr[v].value=tr[v].lazy=k;
return;
}
if(tr[v].lazy) pushdown(v);
int mid=(tr[v].l+tr[v].r)>>;
if(l<=mid) update(v<<,l,r,k);
if(r>mid) update(v<<|,l,r,k);
if(tr[v<<].value==tr[v<<|].value)
tr[v].value=tr[v<<].value;
else
tr[v].value=;
} void query(int v,int l,int r){
if(l<=tr[v].l&&r>=tr[v].r&&tr[v].value){
if(!vis[tr[v].value]){
++ans;
vis[tr[v].value]=;
}
return;
}
if(tr[v].lazy) pushdown(v);
int mid=(tr[v].l+tr[v].r)>>;
if(l<=mid) query(v<<,l,r);
if(r>mid) query(v<<|,l,r);
if(tr[v<<].value==tr[v<<|].value)
tr[v].value=tr[v<<].value;
else
tr[v].value=;
} int main(){
scanf("%d%d%d",&L,&T,&O);
build(,,L);
update(,,L,);
while(O--){
scanf(" %c",&c);
int a,b,k;
if(c=='C'){
scanf("%d%d%d",&a,&b,&k);
if(a>b){
int t=a;a=b,b=t;
}
update(,a,b,k);
}
else{
scanf("%d%d",&a,&b);
if(a>b){
int t=a;a=b,b=t;
}
ans=;
for(int i=;i<=T;++i)
vis[i]=;
query(,a,b);
printf("%d\n",ans);
}
}
return ;
}
poj2777(线段树)的更多相关文章
- poj-2777线段树刷题
title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...
- Count Color poj2777 线段树
Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...
- poj2777 线段树
//Accepted 4768 KB 391 ms //线段树,延时标记的应用 //对于每一段,用一个int表示被着色的情况,change标记该段的颜色是否发生整体的改变,即这一段 //用没用被全部涂 ...
- POJ2777(线段树涂色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42828 Accepted: 12973 Des ...
- Count Color(线段树+位运算 POJ2777)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...
- [POJ2777]Count Color(线段树)
题目链接:http://poj.org/problem?id=2777 给你一个长为L想线段,向上面染色,颜色不超过30种,一共有O次操作,操作有两种: C a b c 在[a,b]上染上c颜色 P ...
- POJ-2777 Count Color(线段树,区间染色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...
- 几道简单的线段树入门题 POJ3264&&POJ3468&&POJ2777
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 40687 Accepted: 19137 ...
- POJ 2777(线段树)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42507 Accepted: 12856 Des ...
随机推荐
- jar包和war包的介绍和区别
jar包和war包的介绍和区别 Java程序员的日常 关注 做Java开发,jar包和war包接触的挺多的,有必要对它们做一个深入的了解,特总结整理如下: 1.jar包的介绍 JAR(Java Arc ...
- 软件推荐----RDO(Remote Desktop Organizer)
平时工作,经常使用远程桌面控制,在多个远程之间切换.使用上Remote Desktop Organizer方便很多.类似的软件很多,此软件只能应用于windows的远程桌面控制,好处如下: 可以保存用 ...
- 二叉排序树插入C语言版 递归步骤理解
//二叉排序树 插入 (纯C语言实现) BTNode * BSTInsert2(BTNode *bt,int key){ //为什么纯C语言实现中 if(bt==NULL){ //要写成 bt-> ...
- key diff 在input上的踩坑
1.在react-native 遇到一个坑,希望的效果如下,同一个按钮,不同的状态下显示不同的input. 2.然后,在做的时候遇到了这样一个问题.输入我的姓名,点击下一步 3.问题出来了,输入框已经 ...
- LDAP目录服务
LDAP目录服务 1.ldap目录服务介绍: 目录是一类为了浏览和搜索数据而设计的特殊的数据库,目录服务是按树状形式存储信息的,目录包含基于属性的描述信息,并且支持高级的过滤功能,一般来说,目录不支持 ...
- php中上传图片,原生代码
一.实现图片上传方法一 html的写法: <form action="handle.php" name="form" method="post& ...
- Ping--域名替换重要角色
Ping-问答解惑 一.ping的概念?目的? 答: (1)ping是:在探测主机与主机之间是否可以通信,建立连接:若是源主机在一定时间内收到应答,则证明主机可达,用户不受影响. (2)ping的最终 ...
- skynet框架之日程表设计
参考云风大神的例子,对其进行了改进,支持多次提交单个日程,改变时间后,提前日程触发时间. --[[ t提供了两种方案 方案1和2 ]] local skynet = require "sky ...
- 实战ELK(8) 安装ElasticSearch中文分词器
安装 方法1 - download pre-build package from here: https://github.com/medcl/elasticsearch-analysis-ik/re ...
- sentry的安装和使用以及各种问题处理
官方的git地址:https://github.com/getsentry/onpremise 需要先安装docker 1.10版本以上 假设你已经安装完docker,那么接下来 安装docker-c ...