POJ-2777-CountColor(线段树,位运算)
链接:https://vjudge.net/problem/POJ-2777#author=0
题意:
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.
思路:
线段树,还是普通的线段树,染色的查询和更新使用位运算,因为颜色区间在(1-30)之内。
所以可以使用(1<<1-1<<30)来表示这中二进制1的个数来表示颜色的数量。
不过我之前的写的普通的线段树我也不知道为啥会WA。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <memory.h>
#include <algorithm>
#include <string>
#include <stack>
#include <vector>
#include <queue> using namespace std;
typedef long long LL;
const int MAXN = 1e5+10; int Seg[MAXN*4];
int lazy[MAXN*4];
int Vis[100];
int n, t, o;
int res; void PushDown(int root)
{
if (lazy[root] != 0)
{
Seg[root<<1] = (1<<lazy[root]);
Seg[root<<1|1] = (1<<lazy[root]); lazy[root<<1] = lazy[root];
lazy[root<<1|1] = lazy[root];
lazy[root] = 0;
}
} void PushUp(int root)
{
Seg[root] = Seg[root<<1]|Seg[root<<1|1];
} void Build(int root, int l, int r)
{
if (l == r)
{
Seg[root] = 2;
return;
}
int mid = (l + r) / 2;
Build(root << 1, l, mid);
Build(root << 1 | 1, mid + 1, r);
PushUp(root);
} void Update(int root, int l, int r, int ql, int qr, int c)
{
if (r < ql || qr < l)
return;
if (ql <= l && r <= qr)
{
Seg[root] = (1<<c);
lazy[root] = c;
return;
}
PushDown(root);
int mid = (l+r)/2;
Update(root<<1, l, mid, ql, qr, c);
Update(root<<1|1, mid+1, r, ql, qr, c);
PushUp(root);
} int Query(int root, int l, int r, int ql, int qr)
{
if (r < ql || qr < l)
return 0;
if (ql <= l && r <= qr)
{
return Seg[root];
}
int mid = (l+r)/2;
PushDown(root);
int col1 = 0, col2 = 0;
col1 = Query(root<<1, l, mid, ql, qr);
col2 = Query(root<<1|1, mid+1, r, ql, qr);
return col1|col2;
} int Get(int x)
{
int res = 0;
while (x)
{
if (x&1)
res++;
x >>= 1;
}
return res;
} int main()
{
char op[10];
int a, b, c;
while (~scanf("%d%d%d", &n, &t, &o))
{
Build(1, 1, n);
while (o--)
{
scanf("%s", op);
if (op[0] == 'C')
{
scanf("%d%d%d", &a, &b, &c);
if (a > b)
swap(a, b);
Update(1, 1, n, a, b, c);
}
else
{
scanf("%d%d", &a, &b);
if (a > b)
swap(a, b);
memset(Vis, 0, sizeof(Vis));
int res = Query(1, 1, n, a, b);
printf("%d\n", Get(res));
}
}
} return 0;
}
POJ-2777-CountColor(线段树,位运算)的更多相关文章
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- POJ 2777 Count Color(线段树+位运算)
题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...
- poj 3225 线段树+位运算
略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...
- hdu 5023 线段树+位运算
主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...
- Codeforces 620E New Year Tree(线段树+位运算)
题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...
- Count Color(线段树+位运算 POJ2777)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...
- Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)
链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...
- poj_2777线段树+位运算
第一次没想到用位运算,不出意料的T了,,, PS:在床上呆了接近两个月后,我胡汉三又杀回来刷题啦-- #include<iostream> #include<cstdio> # ...
- poj 2777(线段树的节点更新策略)
/* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
随机推荐
- 系统常用VC++运行时下载地址
Microsoft Visual C++ 2005 Microsoft Visual C++ 2005 Redistributable Package (x86) https://www.micro ...
- PHP相关安全配置【转】
PHP是广泛使用的开源服务端脚本语言.通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容.服务端脚本语言的错误配置会导致各种问题.因此,PHP应该小心使用.以下是为系统管理员 ...
- 基于 bi-LSTM和CRF的中文命名实体识别
follow: https://github.com/zjy-ucas/ChineseNER 这里边主要识别的实体如图所示,其实也就主要识别人名PER,机构ORG和地点LOC: B表示开始的字节,I ...
- 洛谷P1584 魔杖
题目描述 Smart在春游时意外地得到了一种好东西——一种非常珍贵的树枝.这些树枝可以用来做优质的魔杖! 选择怎样的切割方式来制作魔杖非常重要,关键问题是——一把魔杖既不能太长.又不能太短,且制作出来 ...
- mysql基础itcast笔记
1. 课程回顾 mysql基础 1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句 2)管理数据库: 增加: create database 数据库 default c ...
- Grunt:常见错误
ylbtech-Grunt:常见错误 1.返回顶部 1. D:\lab6\DS.JZB.Web>grunt build Running "clean:dist" (clean ...
- Unique Binary Search Trees-计算表示相同序列的不同BST个数
题目描述: 给定整数n,计算存储序列为1...n的结构唯一的BST的个数 题目来源: http://oj.leetcode.com/problems/unique-binary-search-tree ...
- MFC中界面自适应
void CMyDlg::OnSize(UINT nType, int cx, int cy){ CDialogEx::OnSize(nType, cx, cy); CRect rt; GetClie ...
- MSSQl分布式查询(转)
MSSQlServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 ...
- Centos7 使用 supervisor 管理进程
一.安装 //直接使用pip安装(pip的安装 http://www.cnblogs.com/yxhblogs/p/8971251.html) pip install supervisor 二.配置 ...