链接: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(线段树,位运算)的更多相关文章

  1. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  2. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

  3. poj 3225 线段树+位运算

    略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...

  4. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  5. Codeforces 620E New Year Tree(线段树+位运算)

    题目链接 New Year Tree 考虑到$ck <= 60$,那么用位运算统计颜色种数 对于每个点,重新标号并算出他对应的进和出的时间,然后区间更新+查询. 用线段树来维护. #includ ...

  6. Count Color(线段树+位运算 POJ2777)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...

  7. 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 ...

  8. poj_2777线段树+位运算

    第一次没想到用位运算,不出意料的T了,,, PS:在床上呆了接近两个月后,我胡汉三又杀回来刷题啦-- #include<iostream> #include<cstdio> # ...

  9. poj 2777(线段树的节点更新策略)

    /* 之前的思想是用回溯的方式进行颜色的更新的!如果用回溯的方法的话,就是将每一个节点的颜色都要更新 通过子节点的颜色情况来判断父节点的颜色情况 !这就是TLE的原因! 后来想一想没有必要 !加入[a ...

  10. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...

随机推荐

  1. 标准兼容HTML5输入框提示信息的插件iHolder_v0.1.06.21.2014_预览版

    由于版面限制,简单说下,详细的内容及在线预览.预览版压缩包,见这里http://levi.cg.am/archives/3507 为什么说是标准兼容: 因为大多数placeholder插件是这样兼容的 ...

  2. PS 滤镜— — 镜头光晕

    clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algorithm'); I=imread ...

  3. python 动态添加属性及方法及“__slots__的作用”

    1.动态添加属性 class Person(object): def __init__(self, newName, newAge): self.name = newName self.age = n ...

  4. 【Opencv】Mat基础

    1.Mat::imread() C++: Mat imread(const string& filename, int flags=1 ) filename – Name of file to ...

  5. 关闭windows10自动更新

    用windows10的小伙伴们应该都被windows10自动更新这个问题折磨过.那到底要这样禁止windows10的自动更新呢? 百度上有一篇文章写的非常好,并且有配套,大家只要根据步骤操作即可,本人 ...

  6. 原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 演示地址:查看演示DEMO 新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:htt ...

  7. 相对路径转绝对路径C++实现

    #include<iostream> #include<string> #include<vector> using namespace std; //相对路径转绝 ...

  8. shell 脚本学习之一 ------let,echo,变量

    转自:http://blog.chinaunix.net/uid-26827001-id-3154024.html 首先看到好多以这样开头的    #!/bin/bash   这个是告诉系统 解释此脚 ...

  9. 《Java多线程编程核心技术》读后感(五)

    下面验证上面三条结论 验证第一条结论: package Second; public class MyObject { } package Second; public class Service { ...

  10. Spring入门第十五课

    泛型依赖注入 看代码: package logan.spring.study.generic.di; public class BaseRepository<T> { } package ...