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

洛谷 P1558 色板游戏(线段树)

题目传送门icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P1558跳到了一道线段树模板题……

解题思路

主要就 2 个操作:

1. 修改区间;2. 区间查询。

很容易可以想到线段树。

同时,观察到:颜色的数量 T \leq 30,于是想到了状态压缩。

于是,线段树的每个节点都会有 l,r,zt,addl,r 为它管辖的区间,zt 为它区间内的各个颜色的状态压缩,add 为懒标记(也是状态压缩的)。

区间修改的话就是线段树的模板;

但是,区间查询,我们需要注意重复的颜色不要算重了即可。

总的来说,就是差不多一道线段树的模板题……

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q;
int c;
struct tree{
	int l,r,sum,zt,add;
}tr[400001];
void build(int u,int l,int r)
{
	tr[u]={l,r,0,1,1};
	if(l==r)return;
	int mid=l+r>>1;
	
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
}
void push_down(int u)
{
	if(tr[u].add)
	{
		//if(tr[u*2].zt&tr[u].add==0)
		//	tr[u*2].sum++;
		tr[u*2].zt=tr[u].add;
		tr[u*2].add=tr[u].add;
		
		//if(tr[u*2+1].zt&tr[u].add==0)
		//	tr[u*2+1].sum++;
		tr[u*2+1].zt=tr[u].add;
		tr[u*2+1].add=tr[u].add;
		tr[u].add=0;
	}
}
void change(int u,int l,int r,int d)
{
	
	if(l<=tr[u].l&&tr[u].r<=r)
	{
		//if(d&tr[u].zt==0)tr[u].sum++;
		tr[u].zt=d;
		tr[u].add=d;
		return;
	}
	push_down(u);
	
	int mid=tr[u].l+tr[u].r>>1;
	
	if(l<=mid)
		change(u*2,l,r,d);
	if(r>mid)
		change(u*2+1,l,r,d);
	tr[u].zt=tr[u*2].zt|tr[u*2+1].zt;
}
int count(int x)
{
	int res=0;
	while(x)
	{
		if(x&1)res++;
		x>>=1;
	}
	return res;
}
int query(int u,int l,int r)
{
//	cout<<tr[u].l<<" "<<tr[u].r<<endl;
	if(l<=tr[u].l&&tr[u].r<=r)
	{
		return tr[u].zt;
	}
	push_down(u);
	int mid=tr[u].l+tr[u].r>>1;
	int res=0;
	if(l<=mid)
		res|=query(u*2,l,r);
	if(r>mid)
		res|=query(u*2+1,l,r);
	return res;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m>>q;
	
	build(1,1,n);
	
	char ch;
	int x,y,z;
	while(q--)
	{
		cin>>ch;
		if(ch=='C')
		{
			cin>>x>>y>>z;
			if(x>y)swap(x,y);
			change(1,x,y,1<<(z-1));
		}
		else{
			c=0;
			cin>>x>>y;
			if(x>y)swap(x,y);
			cout<<count(query(1,x,y))<<"\n";
		}
	}
}


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

相关文章:

  • Spring boot之BeanDefinition介绍
  • 无人机数据处理系统:原理与核心系统
  • 算法刷题Day1
  • 基于深度学习和卷积神经网络的乳腺癌影像自动化诊断系统(PyQt5界面+数据集+训练代码)
  • 202页MES项目需求方案深入解读,学习MES系统设计规划
  • Redis主从架构
  • 管理表空间和数据文件(二)
  • 江协科技最新OLED保姆级移植hal库
  • 阅文集团大数据面试题及参考答案
  • qt 的udp发送和接收
  • Vue SSR基础介绍与实践
  • Pycharm使用Jupyterlab报错:Jupyter command `jupyter-notebook` not found
  • 计算机毕业设计Python深度学习游戏推荐系统 Django PySpark游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
  • AI 编译器学习笔记之十三 -- Pytorch 特性实现
  • [golang][MAC]Go环境搭建+VsCode配置
  • 设计模式学习[10]---迪米特法则+外观模式
  • mrRobot解题过程
  • 基于自编码器的深度回归模型:原理、实现与分析
  • Cause: java.sql.SQLException: No value specified for parameter 4
  • 【机器学习】梯度消失和梯度爆炸问题
  • pytorch中一个tensor经过多次softmax会有什么变化?
  • 【Linux课程学习】:《简易版shell实现和原理》 《哪些命令可以让子进程执行,哪些命令让shell执行(内键命令)?为什么?》
  • Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
  • 未来已来!联想推出汽车智能空间解决方案
  • PWN的简单了解
  • 逆向攻防世界CTF系列42-reverse_re3