..2243

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int MaxN = 100000 + 5;

int n, m, Index;
int A[MaxN], Pos[MaxN], Col[MaxN], Son[MaxN], Father[MaxN], Top[MaxN], Size[MaxN], Depth[MaxN];
int V[MaxN * 4], Lnum[MaxN * 4], Rnum[MaxN * 4];

struct Edge
{
	int v;
	Edge *Next;
} E[MaxN * 2], *P = E, *Point[MaxN];

inline void AddEdge(int x, int y) {
	++P; P -> v = y;
	P -> Next = Point[x]; Point[x] = P;
}

int DFS_1(int x, int Fa, int Dep) {
	Father[x] = Fa; Depth[x] = Dep;
	Size[x] = 1;
	int MaxSonSize, SonSize;
	MaxSonSize = 0;
	for (Edge *j = Point[x]; j; j = j -> Next) {
		if (j -> v == Fa) continue;
		SonSize = DFS(j -> v, x, Dep + 1);
		Size[x] += SonSize;
		if (SonSize > MaxSonSize) {
			Son[x] = j -> v;
			MaxSonSize = SonSize;
		}
	}
	return Size[x];
}

void DFS_2(int x) {
	if (x == Son[Father[x]]) Top[x] = Top[Father[x]];
	else Top[x] = x;
	Pos[x] = ++Index;
	A[Pos[x]] = Col[x];
	DFS_2(Son[x]);
	for (Edge *j = Point[x]; j; j = j -> Next) {
		if (j -> v == Father[x] || j -> v == Son[x]) continue;
		DFS_2(j -> v);
	}
}

inline void Update(int x) {
	V[x] = V[x << 1] + V[x << 1 | 1];
	Lnum[x] = Lnum[x << 1];
	Rnum[x] = Rnum[x << 1 | 1];
	if (Rnum[x << 1] == Lnum[x << 1 | 1]) --V[x];
}

void BuildTree(int x, int s, int t) {
	if (s == t) {
		Lnum[x] = A[x];
		Rnum[x] = A[x];
		V[x] = 1;
		return;
	}
	int m = (s + t) >> 1;
	BuildTree(x << 1, s, m);
	BuildTree(x << 1 | 1, m + 1, t);
	Update(x);
}

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) scanf("%d", &Col[i]);
	for (int i = 1; i <= n - 1; ++i) {
		scanf("%d%d", &a, &b);
		AddEdge(a, b);
		AddEdge(b, a);
	}
	Index = 0;
	DFS_1(1, 0, 0);
	DFS_2(1);
	BuildTree(1, 1, n);
	char ch;
	for (int i = 1; i <= m; ++i) {
		ch = ‘0‘;
		while (ch != ‘C‘ && ch != ‘Q‘) ch = getchar();
		scanf("%d%d%d", &a, &b, &c);

	}
	return 0;
}

  

时间: 2024-10-24 21:25:07

..2243的相关文章

ZOJ - 2243 - Binary Search Heap Construction

先上题目: Binary Search Heap Construction Time Limit: 5 Seconds      Memory Limit: 32768 KB Read the statement of problem G for the definitions concerning trees. In the following we define the basic terminology of heaps. A heap is a tree whose internal n

BZOJ 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1886  Solved: 752[Submit][Status] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. In

bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完

bzoj-2243 2243: [SDOI2011]染色(树链剖分)

题目链接: 2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6267  Solved: 2291 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. Input 第一行包含

2243: [SDOI2011]染色(树链剖分+线段树)

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 8400  Solved: 3150[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完

BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并

2243: [SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写一个程序依次完成这m个操作. Input 第一行包含2个整数n和m,分别表示节点数和操作数: 第二行包含n个正整数表示n个节点的初始颜色 下面 行每行包含两个整数x和y,表示x和y之间有一条无向边.

BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2243 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”.“222”和“1”. 请你写

hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4843    Accepted Submission(s): 1527 Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了.一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如

hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <231)的单词中至少含有一个词根的单词个数:结果mod 264. 基础:poj 2778DNA 序列求的是给定长度不含模式串的合法串的个数:串长度相当,都到了int上界了: 1.mod 264直接使用unsigned long long自然溢出即可:说的有些含蓄..并且也容易想到是直接使用内置类型,要不然高精度的

HYSBZ 2243 染色 (树链剖分)

HYSBZ 2243 染色 题目链接 树链剖分,关键在于线段树的维护,对于每个结点要记录下最左边和最右边的颜色,合并的时候,如果颜色相同那么颜色段要减1 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 100005; int dep[N], fa[N], son[N], sz[N