当前位置: 首页 > article >正文

统计颜色Count Color(POJ2777)题解

有一个长度为L厘米板,L是一个正整数,所以我们可以把它均匀地划分成L个部分,分别从左到右编号为1,2……L,每一个部分长度都为1厘米。现在我们必须给每个部分涂色,一个部分一种颜色,要求完成以下两种操作:   1.“C A B C1”:表示从A部分到B部分涂上C1颜色。   2.“P A B”:表示从A部分到B部分涂了几种颜色。   在我们的日常生活中,我们有非常少几种颜色(红色,绿色,蓝色,黄色...),所以你可以假设不同颜色的总数T是非常少。简单地说,我们表示颜色的名称为颜色1,颜色2,…..颜色T。最初时候,这个厘米版都涂成颜色1。

思路

由于颜色很少,所以说可以给他状态压缩成一个数。

也就是支持一下几个操作:
1.区间或上1<<k

2.查询区间的或值

然后用线段树做就可以了。

懒标记更新有一点不一样。

// C++ includes used for precompiling -*- C++ -*-

// Copyright (C) 2003-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file stdc++.h
 *  This is an implementation file for a precompiled header.
 */

// 17.4.1.2 Headers

// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cuchar>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

#if __cplusplus >= 201402L
#include <shared_mutex>
#endif

#if __cplusplus >= 201703L
#include <any>
#include <charconv>
// #include <execution>
#include <filesystem>
#include <optional>
#include <memory_resource>
#include <string_view>
#include <variant>
#endif

#if __cplusplus > 201703L
#include <barrier>
#include <bit>
#include <compare>
#include <concepts>
#if __cpp_impl_coroutine
# include <coroutine>
#endif
#include <latch>
#include <numbers>
#include <ranges>
#include <span>
#include <stop_token>
#include <semaphore>
#include <source_location>
#include <syncstream>
#include <version>
#endif
//以上为万能头(POJ不能直接用,差评)
using namespace std;
const int N = 1000010;
int w[N];
struct owl {
	int l, r, v, q;
} tr[N * 4];
void pushup(int u) {
	tr[u].v = tr[u << 1].v | tr[u << 1 | 1].v;
}
void pushdown(int u) {
	tr[u].q = 0;
	tr[u << 1].q = tr[u << 1 | 1].q = 1;
	tr[u << 1].v = tr[u << 1 | 1].v = tr[u].v;
}
void build(int u, int l, int r) {
	tr[u].l = l;
	tr[u].r = r;
	if (l == r) {
		tr[u].v = 1;
		return ;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
	pushup(u);
}
int query(int u, int l,int r) {
	if (tr[u].q){
		return tr[u].v;
	}
	if (tr[u].l >= l && tr[u].r <= r){
		return tr[u].v;
	}
	int mid = tr[u].l + tr[u].r >> 1;
	if (r <= mid){
		return query(u << 1,l,r);
	}
	else if (l > mid){
		return query(u << 1 | 1,l,r);
	}
	else{
		return query(u << 1,l,mid) | query(u << 1 | 1,mid + 1,r);
	}
}
void modify(int u, int l, int r, int v) {
	if (tr[u].q) {
		pushdown(u);
	}
	if (tr[u].l >= l && tr[u].r <= r) {
		tr[u].v = 1 << (v - 1);
		tr[u].q = 1;
		return ;
	}
	int mid = tr[u].l + tr[u].r >> 1;
	if (r <= mid){
		modify(u << 1,l,r,v);
	}
	else if (l > mid){
		modify(u << 1 | 1,l,r,v);
	}
	else{
		modify(u << 1,l,r,v);
		modify(u << 1 | 1,l,r,v);
	}
	pushup(u);
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int L,T,M;
	cin >> L >> T >> M;
	build(1,1,L);
	while (M -- ){
		char op;
		cin >>op;
		if (op == 'C'){
			int l,r,c;
			cin >> l >> r >> c;
			if (l> r){
				swap(l,r);
			}
			modify(1,l,r,c);
		}
		else{
			int l,r;
			cin >> l >> r;
			if (l > r){
				swap(l,r);
			}
			int t = query(1,l,r);
//			cout << t << endl;
			int res = 0;
			for (int i = 0; i < T; i ++ ){
				if (t & ((1 << i))){
					res ++ ;
				}
			}
			cout << res << "\n";
		}
	}
	return 0;
}

http://www.kler.cn/a/459286.html

相关文章:

  • lenovo联想IdeaPad 15sIML 2020款(81WB)笔记本电脑原装出厂OEM预装系统Windows10镜像下载
  • ​​​​​​​CDP集群安全指南系列文章导读
  • C# 设计模式:装饰器模式与代理模式的区别
  • 【保姆级】sql注入之堆叠注入
  • docker使用国内镜像
  • Ungoogled Chromium127 编译指南 MacOS 篇(一)- 项目介绍
  • 【UE5 C++课程系列笔记】16——DeveloperSettings(开发者设置)的基本使用——创建配置文件
  • 【linux进程】进程终止进程等待
  • CSS(层叠样式表)基础选择器,文字控制属性
  • SpringBoot发邮件(带附件)
  • 《Vue进阶教程》第二十九课:立即执行的回调
  • OpenTK 光照与材质详解
  • 瓷砖缺陷检测数据集,使用yolo,coco json,pasical voc xml格式标注,可识别边缘崩裂,破洞,裂缝等缺陷,一共7992张原始图
  • 批量新建日报表只需10秒-Excel易用宝
  • HarmonyOS初步探索
  • [羊城杯 2024]miaoro
  • 嵌入科技的温情
  • 你有哪些Deep Learning(RNN、CNN)调参的经验?
  • Mysql(MGR)和ProxySQL搭建部署-Docker版本
  • 《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具
  • 【Go】Go数据类型详解—map
  • 2024.12.30(多点通信)
  • C语言-找出数组中两个数字的和为该数字的位置
  • 大数据面试笔试宝典之HBase面试
  • ECMAScript基础
  • Cypress测试框架详解:轻松实现端到端自动化测试