首页 > 其他分享 >lgP1558 色板游戏

lgP1558 色板游戏

时间:2024-07-14 14:19:38浏览次数:19  
标签:Info std info return 游戏 int void 色板 lgP1558

有编号为1~T的T种颜色和一块长为L的色板,每块色板只有一个颜色,最初均为颜色1,有O次操作:

  • C x y z,将区间[x,y]的色板涂成颜色z。
  • P x y,询问区间[x,y]有多少种不同的颜色。

范围:1<=L<=1e5, 1<=T<=30, 1<=O<=1e5。

分析:线段树维护区间内有哪些颜色,因为颜色种数少,可以用状压或者bitset。

#include <bits/stdc++.h>
using llong = long long;

template<class Info, class Tag>
struct LazySegmentTree {
	int n;
	std::vector<Info> info;
	std::vector<Tag> tag;
	LazySegmentTree():n(0) {}
	LazySegmentTree(int _n, Info v=Info()) {
		init(_n, v);
	}
	template<class T>
	LazySegmentTree(std::vector<T> v) {
		init(v);
	}
	void init(int _n, Info v=Info()) {
		init(std::vector<Info>(_n, v));
	}
	template<class T>
	void init(std::vector<T> v) {
		n = v.size();
		info.assign(4 << std::__lg(n), Info());
		tag.assign(4 << std::__lg(n), Tag());
		std::function<void(int,int,int)> build = [&](int x, int l, int r) {
			if (l + 1 == r) {
				info[x] = v[l];
				return;
			}
			int m = (l + r) / 2;
			build(2*x+1, l, m);
			build(2*x+2, m, r);
			pushup(x);
		};
		build(0, 0, n);
	}
	void pushup(int x) {
		info[x] = info[2*x+1] + info[2*x+2];
	}
	void apply(int x, const Tag &t) {
		info[x].apply(t);
		tag[x].apply(t);
	}
	void pushdown(int x) {
		apply(2*x+1, tag[x]);
		apply(2*x+2, tag[x]);
		tag[x] = Tag();
	}
	void assign(int x, int l, int r, int p, const Info &v) {
		if (l + 1 == r) {
			info[x] = v;
			return;
		}
		int m = (l + r) / 2;
		pushdown(x);
		if (p < m) {
			assign(2*x+1, l, m, p, v);
		} else {
			assign(2*x+2, m, r, p, v);
		}
		pushup(x);
	}
	void assign(int p, const Info &v) {
		assign(0, 0, n, p, v);
	}
	void add(int x, int l, int r, int p, const Info &v) {
		if (l + 1 == r) {
			info[x] += v;
			return;
		}
		int m = (l + r) / 2;
		pushdown(x);
		if (p < m) {
			add(2*x+1, l, m, p, v);
		} else {
			add(2*x+2, m, r, p, v);
		}
		pushup(x);
	}
	void add(int p, const Info &v) {
		add(0, 0, n, p, v);
	}
	Info rangeQuery(int x, int l, int r, int L, int R) {
		if (R <= l || r <= L) {
			return Info();
		}
		if (L <= l && r <= R) {
			return info[x];
		}
		int m = (l + r) / 2;
		pushdown(x);
		return rangeQuery(2*x+1, l, m, L, R) + rangeQuery(2*x+2, m, r, L, R);
	}
	Info rangeQuery(int L, int R) {
		return rangeQuery(0, 0, n, L, R);
	}
	void rangeApply(int x, int l, int r, int L, int R, const Tag &t) {
		if (R <= l || r <= L) {
			return;
		}
		if (L <= l && r <= R) {
			apply(x, t);
			return;
		}
		int m = (l + r) / 2;
		pushdown(x);
		rangeApply(2*x+1, l, m, L, R, t);
		rangeApply(2*x+2, m, r, L, R, t);
		pushup(x);
	}
	void rangeApply(int L, int R, const Tag &t) {
		return rangeApply(0, 0, n, L, R, t);
	}
	template<class F>
	int findFirst(int x, int l, int r, int L, int R, F && pred) {
		if (R <= l || r <= L) {
			return -1;
		}
		if (L <= l && r <= R && !pred(info[x])) {
			return -1;
		}
		if (l + 1 == r) {
			return l;
		}
		int m = (l + r) / 2;
		pushdown(x);
		int res = findFirst(2*x+1, l, m, L, R, pred);
		if (res == -1) {
			res = findFirst(2*x+2, m, r, L, R, pred);
		}
		return res;
	}
	template<class F>
	int findFirst(int L, int R, F &&pred) {
		return findFirst(0, 0, n, L, R, pred);
	}
	template<class F>
	int findLast(int x, int l, int r, int L, int R, F &&pred) {
		if (R <= l || r <= L) {
			return -1;
		}
		if (L <= l && r <= R && !pred(info[x])) {
			return -1;
		}
		if (l + 1 == r) {
			return l;
		}
		int m = (l + r) / 2;
		pushdown(x);
		int res = findLast(2*x+2, m, r, L, R, pred);
		if (res == -1) {
			res = findLast(2*x+1, l, m, L, R, pred);
		}
		return res;
	}
	template<class F>
	int findLast(int L, int R, F &&pred) {
		return findLast(0, 0, n, L, R, pred);
	}
	void print(int x, int l, int r) {
		std::cerr << x << "(" << l << "," << r << ") " << info[x] << " " << tag[x] << "\n";
		if (l + 1 < r) {
			int m = (l + r) / 2;
			print(2*x+1, l, m);
			print(2*x+2, m, r);
		}
	}
	void print() {
		std::cerr << "-----------------------------\n";
		print(0, 0, n);
	}
};

struct Tag {
	int c;
	Tag(int C=0):c(C) {}
	void apply(Tag t) {
		if (t.c) {
			c = t.c;
		}
	}
	friend std::ostream& operator<<(std::ostream &out, Tag &tag) {
		out << "tag:(" << tag.c << ")";
		return out;
	}
};

struct Info {
	std::bitset<32> color;
	Info() {}
	void apply(Tag t) {
		if (t.c) {
			color.reset();
			color.set(t.c);
		}
	}
	friend Info operator+(const Info &a, const Info &b) {
		Info ans;
		ans.color = a.color | b.color;
		return ans;
	}
	friend std::ostream& operator<<(std::ostream &out, Info &info) {
		out << "info:(" << info.color.to_string() << ")";
		return out;
	}
};

void solve() {
	int L, T, O;
	std::cin >> L >> T >> O;
	std::vector<Info> A(L);
	for (int i = 0; i < L; i++) {
		A[i].color.set(1);
	}
	LazySegmentTree<Info,Tag> tr(A);
	for (int i = 0; i < O; i++) {
		std::string op;
		int x, y, z;
		std::cin >> op >> x >> y;
		if (x > y) std::swap(x, y);
		if (op == "C") {
			std::cin >> z;
			tr.rangeApply(x-1, y, Tag(z));
		} else if (op == "P") {
			std::cout << tr.rangeQuery(x-1, y).color.count() << "\n";
		}
	}
}

int main() {
	std::cin.tie(0)->sync_with_stdio(0);
	int t = 1;
	while (t--) solve();
	return 0;
}

标签:Info,std,info,return,游戏,int,void,色板,lgP1558
From: https://www.cnblogs.com/chenfy27/p/18301497

相关文章

  • 单机角色扮演游戏推荐:颂钟长鸣 Bellwright 中文安装包
    自从被诬陷谋杀王子并被王庭判处死刑后,您一直活在阴影之中。在侥幸的又一次逃过刺客的暗杀后,您发现了了一张刺客的合同,事情的走向开始变得扑朔迷离-您被诬陷仅仅是因为不幸吗?还是说背后有更大的阴谋?为了寻找答案,您决定结束背井离乡的生活并回来调查。您将逐步领导一场叛乱,反......
  • 最小数字游戏(Lc2974)——模拟+优先队列(小根堆)、排序+交换
    你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice和Bob决定玩一个游戏,游戏中每一轮Alice和Bob都会各自执行一次操作。游戏规则如下:每一轮,Alice先从 nums 中移除一个 最小 元素,然后Bob执行同样的操作。接着,Bob会将......
  • 【Python实战项目】用Python制作游戏—pygame超级玛丽!游戏开发
    1、需求分析具备功能播放与停止背景音乐随机生成管道与导弹障碍显示积分跳跃躲避障碍碰撞障碍2、游戏功能结构玛丽冒险的功能结构主要分为三类,分别为音效、主窗体以及随机出现的障碍物。如下图3、游戏业务流程根据该游戏的需求分析以及功能结构##-、游戏预览......
  • RC-u3 骰子游戏
    目录题目描述:输入格式:输出格式:输入样例:输出样例:样例说明:解题思路(DFS)完整代码(C++)题目描述:在某个游戏中有一个骰子游戏。在游戏中,你需要投掷5个标准六面骰子(骰子为一个正方体,6个面上分别有1、2、3、4、5、6中的一个数字,骰子的质量均匀),投出的点数根据组......
  • 游戏陪玩平台源码,日期格式化的代码分析
    游戏陪玩平台源码,日期格式化的代码分析日期格式化//格式化日期类型,fmt格式可选择functiondateFormat(fmt,date){letret;letopt={"Y+":date.getFullYear().toString(),//年"M+":(date.getMonth()+1).toString(),//月"D+":date.get......
  • 游戏陪玩系统源码,时间转换及时分秒差值计算
    游戏陪玩系统源码,时间转换及时分秒差值计算时间转换(秒数转时分秒)functiontimeFormat(sec){letminite=Math.floor((sec/60%60))<10?'0'+Math.floor((sec/60%60)):Math.floor((sec/60%60));letsecond=Math.floor((sec%60))<10?......
  • 游戏陪玩app开发,必须知道的拷贝代码
    游戏陪玩app开发,必须知道的拷贝代码(数组/对象)(深/浅)拷贝letlist=[{name:"o"}];letobj={stu:{name:"o"}};//数组浅拷贝letlistCopy1=[].concat(list);letlistCopy2=list.slice();letlistCopy3=Array.from(list);letlistCopy4=[...li......
  • 实现猜数字游戏(C语言)
    简单版本#include<stdio.h>#include<stdlib.h>#include<time.h>#include<Windows.h>#include<string.h>voidmenu(){ chararr[]="************************"; chararr1[]="--Welcometomygame!!--"; int......
  • 【云服务器介绍】选择指南 腾讯云 阿里云全配置对比 搭建web 个人开发 app 游戏服务器
    ​省流目录:适用于博客建站(2-4G)、个人开发/小型游戏[传奇/我的世界/饥荒](4-8G)、数据分析/大型游戏[幻兽帕鲁/雾锁王国]服务器(16-64G)1.京东云-专属活动 官方采购季专属活动地址:京东云-618采购季服务器活动专区https://3.cn/20-J4jjX京东云又双叒降价了!活动页大改,增加两个大......
  • 【视频讲解】Python比赛LightGBM、XGBoost+GPU和CatBoost预测学生在游戏学习过程表现|
    全文链接:https://tecdat.cn/?p=36990原文出处:拓端数据部落公众号分析师:QiZhang背景基于游戏进行学习能让学校变得有趣,这种教育方法能让学生在游戏中学习,使其变得有趣和充满活力。尽管基于游戏的学习正在越来越多的教育环境中使用,但能用应用数据科学和学习分析原理来......