博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
阅读量:6693 次
发布时间:2019-06-25

本文共 2968 字,大约阅读时间需要 9 分钟。

解题报告

题意:

对线段染色。询问线段区间的颜色种数。

思路:

本来直接在线段树上染色,lz标记颜色。每次查询的话訪问线段树,求出颜色种数。结果超时了,最坏的情况下,染色能够染到叶子节点。

换成存下区间的颜色种数,这样每次查询就不用找到叶子节点了。用按位或来处理颜色种数。

 

#include 
#include
#include
#include
using namespace std;int sum[500000],lz[500000],ans;void push_down(int rt,int l,int r){ if(lz[rt]) { lz[rt<<1]=lz[rt<<1|1]=lz[rt]; sum[rt<<1]=lz[rt]; sum[rt<<1|1]=lz[rt]; lz[rt]=0; }}void push_up(int rt,int l,int r){ sum[rt]=sum[rt<<1]|sum[rt<<1|1];}void cbtree(int rt,int l,int r){ if(l==r) { sum[rt]=1; return ; } int mid=(l+r)>>1; cbtree(rt<<1,l,mid); cbtree(rt<<1|1,mid+1,r); push_up(rt,l,r);}void update(int rt,int l,int r,int ql,int qr,int v){ if(ql>r||qr
>1; push_down(rt,l,r); update(rt<<1,l,mid,ql,qr,v); update(rt<<1|1,mid+1,r,ql,qr,v); push_up(rt,l,r);}int _q(int rt,int l,int r,int ql,int qr){ if(ql>r||qr
>1; return _q(rt<<1,l,mid,ql,qr) | _q(rt<<1|1,mid+1,r,ql,qr);}int main(){ int n,t,q,ql,qr,i,j,a,k; char str[10]; scanf("%d%d%d",&n,&t,&q); cbtree(1,1,n); while(q--) { scanf("%s",str); if(str[0]=='C') { scanf("%d%d%d",&ql,&qr,&a); if(ql>qr)swap(ql,qr); update(1,1,n,ql,qr,1<<(a-1)); } else { scanf("%d%d",&ql,&qr); if(ql>qr)swap(ql,qr); ans=_q(1,1,n,ql,qr); int cnt=0; while(ans) { if(ans%2) cnt++; ans/=2; } printf("%d\n",cnt); } } return 0;}

Count Color
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 35143   Accepted: 10591

Description

Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.
There is a very long board with length L centimeter, L is a positive integer, so we can evenly divide the board into L segments, and they are labeled by 1, 2, ... L from left to right, each is 1 centimeter long. Now we have to color the board - one segment with only one color. We can do following two operations on the board:
1. "C A B C" Color the board from segment A to segment B with color C.
2. "P A B" Output the number of different colors painted between segment A and segment B (including).
In our daily life, we have very few words to describe a color (red, green, blue, yellow…), so you may assume that the total number of different colors T is very small. To make it simple, we express the names of colors as color 1, color 2, ... color T. At the beginning, the board was painted in color 1. Now the rest of problem is left to your.

Input

First line of input contains L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000). Here O denotes the number of operations. Following O lines, each contains "C A B C" or "P A B" (here A, B, C are integers, and A may be larger than B) as an operation defined previously.

Output

Ouput results of the output operation in order, each line contains a number.

Sample Input

2 2 4C 1 1 2P 1 2C 2 2 2P 1 2

Sample Output

21

 

转载地址:http://uqcoo.baihongyu.com/

你可能感兴趣的文章
springboot整合mybatis(SSM开发环境搭建)
查看>>
Oracle性能优化之查询语句通用原则
查看>>
Eclipse集成ijkplayer并实现本地和网络视频播放等
查看>>
C# 将文件夹中文件复制到另一个文件夹
查看>>
模态视图-多视图应用
查看>>
Java基础-进制转换
查看>>
ASP.NET MVC中错误处理方式
查看>>
编程处理邮件
查看>>
都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行用法
查看>>
Xshell如何修改字体大小和颜色
查看>>
对Spring 的RestTemplate进行包装
查看>>
Kettle能做什么?
查看>>
撰写合格的REST API
查看>>
【Python 数据分析】jieba文本挖掘
查看>>
[日常] PHP与Mysql测试kill慢查询并检验PDO的错误模式
查看>>
WPF仿百度Echarts人口迁移图
查看>>
XamlReader动态使用xaml
查看>>
springcloud9----feign-client-without-hystrix
查看>>
关于redis连接池
查看>>
C#多线程
查看>>