[Ipsc2009]Let there be rainbows!

news2024/11/27 22:39:14

Description

HY Star是一个处处充满和谐,人民安居乐业的星球,但是HY Star却没有被评上宇宙文明星球,很大程度上是因为 星球的形象问题。HY Star由N个国家组成,并且在一些国家之间修建了道路以方便交流。由于HY Star是一个和谐的 星球,因此任意两个国家有且仅有一条路径连接它们。而让HY Star备受诟病的便是他们修建的道路的颜色过于单 调,全部是使用灰色。经过了一年又一年的宇宙文明星球的落选,HY Star的首领BOSS决定改变这种状况,但是他并 不想重新修建新的道路,因为这太耗费人力物力,他决定将已有的道路重新涂色。在各方的讨论下,BOSS决定将现 有的道路涂成彩虹的颜色。每一天,BOSS都会选择两个国家A,B和一种颜色C,并将A,B之间颜色不是C的道路的颜色 都涂成C。BOSS将涂色的具体计划预先告诉了颜料厂,以便有充足的时间来准备颜料。作为颜料厂的负责人,你需要 知道每种颜色被使用了多少次。

Format

Input

第一行,一个整数N,表示HY Star的国家的编号是1~N。

下面若干行,每行两个数A,B,表示A,B之间有道路直接连接。

下面一行,一个整数Q,表示计划的持续天数。

下面Q行,每行三个正整数,S,T,C(1<=S,T<=N,1<=C<=7),表示将S,T之间颜色不是C的道路的颜色都涂成C。

1 < = N,Q < = 200000

Output

共包含7行,第i行包含一个整数,表示颜色i的使用次数。

Samples

输入数据 1

4
1 2
2 3
3 4
3
1 4 1
2 4 2
1 3 1

输出数据 1

4
2
0
0
0
0
0

Solution:

这道题应该是一道树链剖分的板子题

两个经典的DFS+线段树求解,详细看TLE代码:

Code:

#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
#define ll long long
const int N=2e5+10;
int n,q;
int pre[4*N],son[4*N],now[4*N],tot;
int dis[N];
void put(int x,int y) {
	pre[++tot]=now[x];
	now[x]=tot;
	son[tot]=y;
}
int dep[N],siz[N],fa[N];
int hs[N];
void dfs1(int x,int f) {//找重边
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	for(int i=now[x]; i; i=pre[i])
		if(son[i]!=f) {
			dfs1(son[i],x);
			siz[x]+=siz[son[i]];
			if(siz[hs[x]]<siz[son[i]])
				hs[x]=son[i];
		}
}
int top[N],dfn[N],rnk[N],cnt;
void dfs2(int x,int f) {//连重边成重链
	top[x]=f;
	dfn[x]=++cnt;
	rnk[cnt]=x;
	if(hs[x]) dfs2(hs[x],f);
	for(int i=now[x]; i; i=pre[i])
		if(hs[x]!=son[i]&&fa[x]!=son[i])
			dfs2(son[i],son[i]);
}
int sum[4*N];
int lazy[4*N];
int ans[10];
void update(int p) {
	sum[p]=sum[ls]+sum[rs];
}
void build(int p,int l,int r) {
	if(l==r) {
		sum[p]=0;
		return ;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(p);
}
void change(int p,int l,int r,int x,int y,int z) {
	if(x<=l&&r<=y&&l==r) {//可以优化
		if(sum[p]!=z) ans[z]++;
		sum[p]=z;
		return ;
	}
	int mid=l+r>>1;
	if(x<=mid) change(ls,l,mid,x,y,z);
	if(y>mid) change(rs,mid+1,r,x,y,z);
	update(p);
}
void qchange(int x,int y,int z) {//树链剖分
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		change(1,1,n,dfn[top[x]],dfn[x],z);
		x=fa[top[x]];
	}
	if(dfn[x]>dfn[y]) swap(x,y);
	if(x!=y) change(1,1,n,dfn[x]+1,dfn[y],z);
}
int x,y,z;
string str;
int main() {
	cin>>n;
	for(int i=1; i<n; i++) {
		cin>>x>>y;
		put(x,y);
		put(y,x);
	}
	dep[1]=1;
	fa[1]=1;
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	cin>>q;
	while(q--) {
		cin>>x>>y>>z;
		qchange(x,y,z);
	}
	for(int i=1; i<=7; i++) cout<<ans[i]<<endl;

	return 0;
}

这个代码是TLE了,但它可以优化,加上一个lazy标记即可

#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
#define ll long long
const int N=2e5+10;
int n,q;
int pre[4*N],son[4*N],now[4*N],tot;
int dis[N];
void put(int x,int y) {
	pre[++tot]=now[x];
	now[x]=tot;
	son[tot]=y;
}
int dep[N],siz[N],fa[N];
int hs[N];
void dfs1(int x,int f) {
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	for(int i=now[x]; i; i=pre[i])
		if(son[i]!=f) {
			dfs1(son[i],x);
			siz[x]+=siz[son[i]];
			if(siz[hs[x]]<siz[son[i]])
				hs[x]=son[i];
		}
}
int top[N],dfn[N],rnk[N],cnt;
void dfs2(int x,int f) {
	top[x]=f;
	dfn[x]=++cnt;
	rnk[cnt]=x;
	if(hs[x]) dfs2(hs[x],f);
	for(int i=now[x]; i; i=pre[i])
		if(hs[x]!=son[i]&&fa[x]!=son[i])
			dfs2(son[i],son[i]);
}
int sum[4*N][10];//sum[p][i]表示以p为根的子树中,颜色i有几条
int lazy[4*N];
int ans[10];
void update(int p) {
	for(int i=0; i<=7; i++)
		sum[p][i]=sum[ls][i]+sum[rs][i];
}
void build(int p,int l,int r) {
	if(l==r) {
		sum[p][0]=1;
		return ;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(p);
}
void push(int p,int l,int r) {//优化
	if(lazy[p]) {
		int mid=l+r>>1;
		for(int i=0; i<=7; i++)
			if(i!=lazy[p])
				sum[ls][i]=sum[rs][i]=0;
		sum[ls][lazy[p]]=mid-l+1;
		sum[rs][lazy[p]]=r-mid;
		lazy[ls]=lazy[rs]=lazy[p];
		lazy[p]=0;
	}
}
void change(int p,int l,int r,int x,int y,int z) {
	if(x<=l&&r<=y) {
		for(int i=0; i<=7; i++)
			if(i!=z)
				ans[z]+=sum[p][i],sum[p][i]=0;
		sum[p][z]=r-l+1;
		lazy[p]=z;
		return ;
	}
	push(p,l,r);
	int mid=l+r>>1;
	if(x<=mid) change(ls,l,mid,x,y,z);
	if(y>mid) change(rs,mid+1,r,x,y,z);
	update(p);
}
void qchange(int x,int y,int z) {
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		change(1,1,n,dfn[top[x]],dfn[x],z);
		x=fa[top[x]];
	}
	if(dfn[x]>dfn[y]) swap(x,y);
	if(x!=y) change(1,1,n,dfn[x]+1,dfn[y],z);
}
int x,y,z;
string str;
int main() {
	cin>>n;
	for(int i=1; i<n; i++) {
		cin>>x>>y;
		put(x,y);
		put(y,x);
	}
	dep[1]=1;
	fa[1]=1;
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	cin>>q;
	while(q--) {
		cin>>x>>y>>z;
		qchange(x,y,z);
	}
	for(int i=1; i<=7; i++) cout<<ans[i]<<endl;

	return 0;
}

这道sb的树链剖分就做完啦!

喜欢可以三连哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream

本课时,我将带你一起了解入口网关服务的注册发现,并使用 OpenResty 实现一套动态 Upstream。 课前学习提示 基于本课时我们将要学习的内容,我建议你课前先了解一下 Nginx 的基础,同时熟悉基础的 Lua 语言语法,另外再回顾一下 HTTP 的请求过程,对于 Nginx 的负载均衡基本…

按键控制流水灯方向——FPGA

文章目录 前言一、按键二、系统设计1、模块框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 按键1按下&#xff0c;流水灯从右开始向左开始流动&#xff0c;按键2按…

习题-Java网络编程

目录 1.TCP-对象 2.UDP​​​​​​​​​​​​​​ 1.TCP-对象 利用TCP传输对象信息&#xff0c;需要对对象进行实例化 User类&#xff1a; package dh09.demo02;import java.io.Serializable;public class User implements Serializable {private String name;private St…

高并发的哲学原理(九)-- 细数四代分布式数据库并拆解

高并发的哲学原理&#xff08;九&#xff09;-- 细数四代分布式数据库并拆解 TiDB 和 OceanBase&#xff08;主从、中间件、KV、计算与存储分离、列存储、CAP定理&#xff09; 本文大约 15000 字&#xff0c;阅读需要 50 分钟。 上一篇文章啃硬骨头差点把我牙给崩了&#xff0c…

提升C++操作Json的开发效率

一、背景 在C项目开发中&#xff0c;不同的服务之间会定义通讯接口&#xff0c;接口格式定义中的通讯数据往往是json格式的。为了快速开发&#xff0c;我的需求如下&#xff1a; 1.定义好通讯接口后&#xff0c;就定义好了交互的json内容格式。我希望有工具可以一键将json内容…

x86架构ubuntu18下运行PS模拟器ePSXe

0. 环境 i7 虚拟机ubuntu18&#xff08;ubuntu22不行&#xff0c;会提示CURL_OPENSSL_3 not found&#xff09; 1. 安装依赖 sudo apt-get install libsdl-ttf2.0-0 sudo apt-get install libcurl3 2. 获取可执行文件 mkdir ePSXe cd ePSXe wget http://www.epsxe.com/files/…

MAYA精灵粒子一

group1.rotateYframe*10; particleShape1.spriteTwistPPrand(-90,90); 少 一个

Debug工具Trace32的ARM内存访问类型详解

关于Trace32的访问类型的基本概念可以参考博文&#xff1a; Trace32使用教程-访问类型&#xff08;Access Class&#xff09;_SOC罗三炮的博客-CSDN博客 本文将以ARMv8为基础&#xff0c;详解Trace32的内存访问类型。 内存访问类型描述A绝对寻址(物理地址)&#xff0c;即绕过…

实现复杂的按钮动画

今天主要是实现一个复杂的按钮提交动画效果&#xff0c;具体的关键变形环节如下&#xff1a; 初始环节 加载环节 展示结果环节 代码实现过程 1、html 页面机构 <button class"btn" data-btn>Submit</button> <div class"check_box">&…

初级与高级软件测试工程师的差距体现在哪些方面?如何成为高级测试工程师?

目录 初级测试工程师和高级测试工程师有什么区别或者差距呢&#xff1f; 一、不断的钻研 二、向同行或者他人学习 三、团队合作是更宽广的提升途径 四、了解你的客户和团队成员 软件测试工程师发展规划路线 我们都在努力追求卓越&#xff1a;希望在我们选择的职业中出类拔…

html2canvas将document DOM节点转换为图片,并下载到本地

html2canvas - Screenshots with JavaScripthttps://html2canvas.hertzen.com/了解一下&#xff0c;安装先 npm install --save html2canvas 用到的知识包括 前端用原生js编辑文件内容→创建生成文件(格式可以自定义)→下载文件_你挚爱的强哥的博客-CSDN博客会自动创建一个h…

服务器使用UDP通讯127.0.0.1测试成功连接服务器却通讯失败

首先看看本人情况 解释一下&#xff1a; 1&#xff1a;左边窗口是模拟服务程序&#xff0c;功能是收到消息后把消息打印出来&#xff0c;并把收到的消息再发回给发送消息的主机 2&#xff1a;右边窗口是模拟客户程序&#xff0c;功能是将输入的消息发送给服务程序的主机&…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一&#xff1a;三个线程竞争同一个锁&#xff0c;通过count判断是否打印 方法二&#xff1a;三个线程同时start&#xff0c;分别上锁&#xff0c;从a开始&#xff0c;打印后唤醒b 三个线程分别打印A&#xff0c;B&#xff0c;C 方法一&#xff1a;通过co…

前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

文章目录 ⭐前言⭐qq三方登录流程&#x1f496;qq互联中心创建网页应用&#x1f496;配置回调地址redirect_uri&#x1f496;流程分析 ⭐思路分解⭐技术选型实现&#x1f496;技术选型&#xff1a;&#x1f496;实现 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本…

4.3.tensorRT基础(1)-实现模型的推理过程

目录 前言1. inference案例总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 基础-实现模型的推理过程 课程大纲可…

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构&#xff0c;允许…

JavaBeans

Code eamples ① Product.java (JavaBean Class) ② Bean.java (Servlet) ③ complie javac -encoding utf-8 -d ..\classes -sourcepath . chapter15\Bean.java ④ Tomcat ⑤ http://localhost:8080/book/chapter15/bean

flink水位线传播及任务事件时间

背景 本文来讲解一下flink的水位线传播及对其对任务事件时间的影响 水位线 首先flink是通过从源头生成水位线记录的方式来实现水位线传播的&#xff0c;也就是说水位线是嵌入在正常的记录流中的特殊记录&#xff0c;携带者水位线的时间戳&#xff0c;以下我们就通过图片的方…

Docker常用命令(三)

1、镜像命令 1、列出本地主机上的镜像 docker images [options]optiins说明&#xff1a; -a&#xff1a;列出本地所有的镜像&#xff08;包含历史映像层&#xff09; -q&#xff1a;只显示镜像ID2、搜索某个镜像信息 docker search [options] 镜像名字3、下载镜像 docker …

Kafka第二课-代码实战、参数配置详解、设计原理详解

一、代码实战 一、普通java程序实战 引入依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.1</version></dependency><dependency>&l…