[SDOI 2011]染色
Description
给定一棵有 \(n\) 个节点的无根树和 \(m\) 个操作,操作有 \(2\) 类:
- 将节点 \(a\) 到节点 \(b\) 路径上所有点都染成颜色 \(c\) ;
- 询问节点 \(a\) 到节点 \(b\) 路径上的颜色段数量(连续相同颜色被认为是同一段)
Solution
线段树苟题。因为没有下传 \(lazy\) 标记调了一上午。
Code
//It is made by Awson on 2018.3.4
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1e5;
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); }
int n, m, c[N+5], a[N+5], u, v, ca;
struct tt {int to, next; }edge[(N<<1)+5];
int path[N+5], Top;
int size[N+5], id[N+5], son[N+5], top[N+5], dep[N+5], fa[N+5], pos;
char ch[5];
struct node {
int l, r, cnt;
node() {}
node(int _l, int _r, int _cnt) {l = _l, r = _r, cnt = _cnt; }
node operator + (const node &b) const {node tmp; tmp.l = l, tmp.r = b.r, tmp.cnt = cnt+b.cnt-(r==b.l); return tmp; }
};
struct Segment_tree {
#define lr(o) (o<<1)
#define rr(o) (o<<1|1)
node sgm[(N<<2)+5]; int lazy[(N<<2)+5];
void pushdown(int o) {sgm[lr(o)] = sgm[rr(o)] = sgm[o]; lazy[lr(o)] = lazy[rr(o)] = 1; lazy[o] = 0; }
void build(int o, int l, int r) {
if (l == r) {sgm[o] = node(a[l], a[l], 1); return; }
int mid = (l+r)>>1;
build(lr(o), l, mid); build(rr(o), mid+1, r); sgm[o] = sgm[lr(o)]+sgm[rr(o)];
}
node query(int o, int l, int r, int a, int b) {
if (a <= l && r <= b) return sgm[o];
if (lazy[o]) pushdown(o); int mid = (l+r)>>1;
if (b <= mid) return query(lr(o), l, mid, a, b);
if (a > mid) return query(rr(o), mid+1, r, a, b);
return query(lr(o), l, mid, a, b)+query(rr(o), mid+1, r, a, b);
}
void update(int o, int l, int r, int a, int b, int col) {
if (a <= l && r <= b) {sgm[o] = node(col, col, 1), lazy[o] = 1; return; }
if (lazy[o]) pushdown(o); int mid = (l+r)>>1;
if (a <= mid) update(lr(o), l, mid, a, b, col);
if (b > mid) update(rr(o), mid+1, r, a, b, col);
sgm[o] = sgm[lr(o)]+sgm[rr(o)];
}
}T;
void add(int u, int v) {edge[++Top].to = v, edge[Top].next = path[u], path[u] = Top; }
void dfs1(int o, int depth, int father) {
dep[o] = depth, size[o] = 1, fa[o] = father;
for (int i = path[o]; i; i = edge[i].next)
if (dep[edge[i].to] == 0) {
dfs1(edge[i].to, depth+1, o); size[o] += size[edge[i].to];
if (size[edge[i].to] > size[son[o]]) son[o] = edge[i].to;
}
}
void dfs2(int o, int tp) {
id[o] = ++pos, a[pos] = c[o], top[o] = tp;
if (son[o]) dfs2(son[o], tp);
for (int i = path[o]; i; i = edge[i].next)
if (edge[i].to != fa[o] && edge[i].to != son[o]) dfs2(edge[i].to, edge[i].to);
}
void update(int u, int v, int c) {
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) Swap(u, v);
T.update(1, 1, n, id[top[u]], id[u], c);
u = fa[top[u]];
}
if (dep[u] < dep[v]) Swap(u, v);
T.update(1, 1, n, id[v], id[u], c);
}
int query(int u, int v) {
node n1, n2; int f1 = 1, f2 = 1;
while (top[u] != top[v]) {
if (dep[top[u]] > dep[top[v]]) {
if (f1) n1 = T.query(1, 1, n, id[top[u]], id[u]);
else n1 = T.query(1, 1, n, id[top[u]], id[u])+n1;
u = fa[top[u]]; f1 = 0;
}else {
if (f2) n2 = T.query(1, 1, n, id[top[v]], id[v]);
else n2 = T.query(1, 1, n, id[top[v]], id[v])+n2;
v = fa[top[v]]; f2 = 0;
}
}
if (dep[u] > dep[v]) {
if (f1) n1 = T.query(1, 1, n, id[v], id[u]);
else n1 = T.query(1, 1, n, id[v], id[u])+n1; f1 = 0;
}else {
if (f2) n2 = T.query(1, 1, n, id[u], id[v]);
else n2 = T.query(1, 1, n, id[u], id[v])+n2; f2 = 0;
}
if (f1) return n2.cnt;
if (f2) return n1.cnt;
Swap(n1.l, n1.r); n1 = n1+n2; return n1.cnt;
}
void work() {
read(n), read(m); for (int i = 1; i <= n; i++) read(c[i]);
for (int i = 1; i < n; i++) read(u), read(v), add(u, v), add(v, u);
dfs1(1, 1, 0), dfs2(1, 1); T.build(1, 1, n);
while (m--) {
scanf("%s", ch);
if (ch[0] == 'Q') read(u), read(v), writeln(query(u, v));
else read(u), read(v), read(ca), update(u, v, ca);
}
}
int main() {
work(); return 0;
}
[SDOI 2011]染色的更多相关文章
- [BZOJ 2243] [SDOI 2011] 染色 【树链剖分】
题目链接:BZOJ - 2243 题目分析 树链剖分...写了200+行...Debug了整整一天+... 静态读代码读了 5 遍 ,没发现错误,自己做小数据也过了. 提交之后全 WA . ————— ...
- BZOJ 2243 SDOI 2011染色
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 算法讨论: 树链剖分把树放到线段树上.然后线段树的每个节点要维护的东西有左端点的颜色 ...
- 解题: SDOI 2011 染色
题面 强行把序列问题通过树剖套在树上...算了算是回顾了一下树剖的思想=.= 每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点 ...
- 【SDOI 2011】染色
[题目链接] 点击打开链接 [算法] 树链剖分 [代码] 本题,笔者求最近公共祖先并没有用树链剖分“往上跳”的方式,而是用倍增法.笔者认为这样比较好写,代码可读性 比较高 此外,笔者的线段树并没有用懒 ...
- 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法
BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...
- [bzoj2286][Sdoi 2011]消耗战
[bzoj2286]消耗战 标签: 虚树 DP 题目链接 题解 很容易找出\(O(mn)\)的做法. 只需要每次都dp一遍. 但是m和n是同阶的,所以这样肯定会T的. 注意到dp的时候有很多节点是不需 ...
- [SDOI 2011]黑白棋
Description 题库链接 给出一个 \(1\times n\) 的棋盘,棋盘上有 \(k\) 个棋子,一半是黑色,一半是白色.最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小 \( ...
- [SDOI 2011]消耗战
Description 题库链接 给你一棵 \(n\) 个节点根节点为 \(1\) 的有根树,有边权. \(m\) 次询问,每次给出 \(k_i\) 个关键点.询问切断一些边,使这些点到根节点不连通, ...
- [SDOI 2011]计算器
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
随机推荐
- C#/AutoCAD 2018/ObjectArx/二次开发添加图形对象步骤和添加直线的例子(三)
1.创建一个图形对象的步骤如下(1)得到创建对象的图形数据库:(2)在内存中创建实体类的一个对象:(3)定义一个指向当前数据库的事务处理:(4)打开图形数据库的块表:(5)打开一个存储实体的块表记录( ...
- Beta No.4
今天遇到的困难: 百度位置假死的问题研究发现并不是源于代码的问题,而是直接运行在主线程中会出现诸多问题 Fragment碎片刷新时总产生的固定位置的问题未果 今天完成的任务: 陈甘霖:修复了部分Bug ...
- Alpha冲刺第十一天
Alpha冲刺第十一天 站立式会议 项目进展 项目进入尾声,主要测设工作完成过半,项目总结也开始进行. 问题困难 项目的困难现阶段主要是测试过程中存在一些"盲点"很难发现或者发现后 ...
- 学号:201621123032 《Java程序设计》第8周学习总结
1:本周学习总结 2:书面作业 2.1:ArrayList代码分析 2.1.1:解释ArrayList的contains源代码 Contains方法调用indexof方法,如果元素为null,则循环比 ...
- surging教学视频资源汇总
surging是什么 surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询.压力最小优先作 ...
- nyoj 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的"KK"非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国 ...
- IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费
大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...
- python-装饰器简述
装饰器是什么 用来修饰别的函数的函数就可以称之为装饰器 这种函数的参数一般就是另外一个函数 也就是说,调用这种函数,需要给这种函数传参,且参数是函数 @语法糖 @语法糖一般用来表示装饰器函数 不用@也 ...
- github提交代码到服务器的方法
第一种情况,没有冲突:1.git add .//进入到center的项目下将本地文件打包的意思2.git pull origin dev//将服务器的代码下载到本地如果是最新的会提示Already u ...
- guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突
guava-19.0 google-collections-1.0 都有 ImmutableSet 类,包路径也一致,前者有 copyOf(Collection)? 一.应用报错: 二.解决办法 co ...