【POJ 2777】 Count Color(线段树区间更新与查询)
【POJ 2777】 Count Color(线段树区间更新与查询)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 40949 | Accepted: 12366 |
Description
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
be larger than B) as an operation defined previously.
Output
Sample Input
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
Sample Output
2
1
Source
感觉有些神经衰弱了。。。写发水水的线段树放松放松。。。
一直在搞图论 是该换换弦 磨得快锈了 太折磨人了……(弱也不知道说了些啥
一块木板 长L(1~L) 有T种颜色的油漆标号1~T 默认木板初始是1号颜色
进行O次操作 操作有两种
C a b c 表示木板a~b段涂c种油漆(若之前涂过其它颜色 则覆盖掉)
P a b 表示询问木板a~b段如今涂了几种油漆
两个数组 一个存树 一个存涂了哪几种油漆
存树的表示a~b涂的某种颜色 然后搞搞就出来了……好乏
代码例如以下:
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout) using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8; int tr[400400];
bool col[33];
int L,T,O; void Color(int root,int l,int r,int a,int b,int c)
{
if(a == l && b == r)
{
tr[root] = c;
return;
}
int mid = (l+r)>>1;
if(tr[root])
tr[root<<1] = tr[root<<1|1] = tr[root];
tr[root] = 0; if(mid >= b) Color(root<<1,l,mid,a,b,c);
else if(mid+1 <= a) Color(root<<1|1,mid+1,r,a,b,c);
else
{
Color(root<<1,l,mid,a,mid,c);
Color(root<<1|1,mid+1,r,mid+1,b,c);
}
} void Search(int root,int l,int r,int a,int b)
{
//printf("root:%d l:%d r:%d co:%d\n",root,l,r,tr[root]);
if(tr[root])
{
col[tr[root]] = 1;
return;
}
int mid = (l+r)>>1;
if(mid >= b) Search(root<<1,l,mid,a,b);
else if(mid+1 <= a) Search(root<<1|1,mid+1,r,a,b);
else
{
Search(root<<1,l,mid,a,mid);
Search(root<<1|1,mid+1,r,mid+1,b);
}
} int main()
{
//fread();
//fwrite();
char opt[3];
int a,b,c; while(~scanf("%d%d%d",&L,&T,&O))
{
memset(tr,0,sizeof(tr));
tr[1] = 1;
while(O--)
{
scanf("%s",opt);
scanf("%d%d",&a,&b);
if(a > b) swap(a,b); if(opt[0] == 'C')
{
scanf("%d",&c);
Color(1,1,L,a,b,c);
}
else
{
memset(col,0,sizeof(col));
Search(1,1,L,a,b); int ans = 0;
for(int i = 1; i <= T; ++i)
ans += col[i];
printf("%d\n",ans);
}
}
} return 0;
}
【POJ 2777】 Count Color(线段树区间更新与查询)的更多相关文章
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- POJ 2777 Count Color(线段树之成段更新)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- poj 2777 Count Color(线段树、状态压缩、位运算)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38921 Accepted: 11696 Des ...
- POJ2777 Count Color 线段树区间更新
题目描写叙述: 长度为L个单位的画板,有T种不同的颜料.现要求按序做O个操作,操作分两种: 1."C A B C",即将A到B之间的区域涂上颜色C 2."P A B&qu ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- ZOJ 1610 Count the Color(线段树区间更新)
描述Painting some colored segments on a line, some previously painted segments may be covered by some ...
随机推荐
- SQL SERVER 执行计划各字段注释
SET SHOWPLAN_ALL使 Microsoft® SQL Server™ 不执行 Transact-SQL 语句.相反,SQL Server 返回有关语句执行方式和语句预计所需资源的详细信息. ...
- 第五届蓝桥杯校内选拔第七题_(树型dp)
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军).现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...
- WINVER WIN32 WINNT
WINVER 和 _WIN32_WINNT 请在WINDOWS.H前定义 从 Visual C++ 2008 开始,Visual C++ 不支持面向 Windows 95.Windows 98.Win ...
- C++标准库 vector排序
前天要做一个对C++ STL的vector容器做一个排序操作,之前一直把vector当做一个容量可自动变化的数组,是的,数组,所以打算按照对数组进行排序的方法:用快速排序或是冒泡排序等算法自己写一个排 ...
- Script:shell脚本生成随机字符串
#!/bin/bash # bash generate random alphanumeric string # # bash generate random character alphanumer ...
- 洛谷——P1349 广义斐波那契数列(矩阵加速)
P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...
- bootstrap-table使用笔记
服务端分页: //html <div class="container-fluid"> <div style="margin-top:1em" ...
- Linux:使用root踢掉其他用户
首先使用w命令查看所有在线用户: 执行命令: pkill -kill -t tty3 再用w命令查看是否已经强制踢掉: TTY 是终端的意思 TTY :0 表示root用户登陆图形化界面的终 ...
- accept阻塞
一直以来以为accept阻塞的时候,若另有线程关闭相应的监听套接字,accept会立即返回. 今天先是在NDK上试,没反应.又在ARCHLINUX试了下,还是没反应.难道是我一直记的都是错的!!!!! ...
- java之比较两个日期大小----https://blog.csdn.net/dongfangbaiyun/article/details/51225469
https://blog.csdn.net/dongfangbaiyun/article/details/51225469 java之比较两个日期大小 最近又用到两个日期大小的比较,因此记录在此,方便 ...