bzoj2243: [SDOI2011]染色--线段树+树链剖分
此题代码量较大。。但是打起来很爽
原本不用lca做一直wa不知道为什么。。
后来改lca重打了一遍= =结果一遍就AC了orz
题目比较裸,也挺容易打,主要是因为思路可以比较清晰
另:加读入优化比没加快了1.3s。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
;
struct node{
int l,r,lc,rc,sum,lz;
}t[maxn*];
struct edge{
int to,next;
}e[maxn*];
;
],size[maxn],col[maxn];
inline void read(int &x){
; ;
; cc=getchar();}
+cc-',cc=getchar(); x*=f;
}
inline void insert(int u, int v){
e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
}
inline void dfs1(int u, int f, int d){
size[u]=; fa[u][]=f; dep[u]=d;
; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
; i=e[i].next){
int v=e[i].to;
if (v==f) continue;
dfs1(v,u,d+);
size[u]+=size[v];
if (!son[u] || size[v]>size[son[u]]) son[u]=v;
}
}
inline void dfs2(int u, int num){
top[u]=num; tree[u]=++cnt;
pre[cnt]=u;
if (!son[u]) return;
dfs2(son[u],num);
; i=e[i].next)
] && e[i].to!=son[u])
dfs2(e[i].to,e[i].to);
}
inline int lca(int u, int v){
if (dep[u]>dep[v]) swap(u,v);
while (dep[u]<dep[v]){
; i--)
if (dep[u]<dep[fa[v][i]])
v=fa[v][i];
v=fa[v][];
}
if (u==v) return u;
; i--)
if (fa[u][i]!=fa[v][i]){
u=fa[u][i];
v=fa[v][i];
}
u=fa[u][];
return u;
}
inline void pushdown(int x){
if (t[x].lz){
t[x<<].lz=t[x<<|].lz=t[x].lz;
t[x<<].lc=t[x<<].rc=t[x<<|].lc=t[x<<|].rc=t[x].lz;
t[x<<].sum=t[x<<|].sum=;
t[x].lz=;
}
}
inline void pushup(int x){
t[x].lc=t[x<<].lc; t[x].rc=t[x<<|].rc;
t[x].sum=t[x<<].sum+t[x<<|].sum-(t[x<<].rc==t[x<<|].lc);
}
inline int query(int a, int b, int x){
int l=t[x].l, r=t[x].r;
if (a==l && r==b) return t[x].sum;
;
pushdown(x);
);
|);
)+query(mid+,b,x<<|)-(t[x<<].rc==t[x<<|].lc);
}
inline void update(int a, int b, int c, int x){
int l=t[x].l, r=t[x].r;
if (a==l && r==b){
t[x].lc=t[x].rc=t[x].lz=c;
t[x].sum=;
return;
}
;
pushdown(x);
);
|);
else{
update(a,mid,c,x<<);
update(mid+,b,c,x<<|);
}
pushup(x);
}
inline int get_col(int a, int x){
int l=t[x].l, r=t[x].r;
if (l==r) return t[x].lc;
pushdown(x);
;
);
|);
}
inline void build(int l, int r, int x){
t[x].l=l; t[x].r=r;
if (l==r){
t[x].lc=t[x].rc=col[pre[l]];
t[x].sum=;
return;
}
;
);
,r,x<<|);
pushup(x);
}
inline void change(int x, int f, int c){
while (top[x]!=top[f]){
update(tree[top[x]],tree[x],c,);
x=fa[top[x]][];
}
update(tree[f],tree[x],c,);
}
inline int get_sum(int x, int f){
;
while (top[x]!=top[f]){
res+=query(tree[top[x]],tree[x],);
)==get_col(tree[fa[top[x]][]],)) res--;
x=fa[top[x]][];
}
res+=query(tree[f],tree[x],);
return res;
}
int main(){
read(n); read(m);
<<logn)<n) logn++;
; i<=n; i++) read(col[i]),col[i]++;
tot=-; memset(head,-,sizeof(head));
; i<n; i++){
read(u); read(v);
insert(u,v); insert(v,u);
}
cnt=;
dfs1(,,); dfs2(,);
build(,n,);
];
while (m--){
scanf("%s", s);
]=='Q'){
read(u); read(v);
int t=lca(u,v);
printf();
}
else{
int color;
read(u); read(v); read(color);
int t=lca(u,v);
color++;
change(u,t,color);
change(v,t,color);
}
}
;
}
bzoj2243: [SDOI2011]染色--线段树+树链剖分的更多相关文章
- [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
- [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...
- BZOJ2243 SDOI2011 染色 【树链剖分】
BZOJ2243 SDOI2011 染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色 ...
- bzoj2243[SDOI2011]染色 树链剖分+线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9012 Solved: 3375[Submit][Status ...
- BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)
题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...
- bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 7925 Solved: 2975[Submit][Status ...
- BZOJ2243: [SDOI2011]染色(树链剖分/LCT)
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如 ...
- 【树链剖分】bzoj2243 [SDOI2011]染色
树链剖分模板题.线段树维护每个段中的颜色数.左端点颜色.右端点颜色. pushup: col[rt]=col[rt<<1]+col[rt<<1|1]-(Rcol[rt<& ...
- [BZOJ2243][SDOI2011]染色(树链剖分)
[传送门] 树链剖分就行了,注意线段树上颜色的合并 Code #include <cstdio> #include <algorithm> #define N 100010 # ...
随机推荐
- 个性化设置phpMyAdmin,去掉“以树形显示数据库”,禁用“发送错误报告”
个性化设置phpMyAdmin 在使用phpMyAdmin 3.5.8.2时,发现: 如果数据库有相同的前缀,左边数据库导航会把前缀合并,即所谓的“以树形显示数据库”,真的有点不习惯,如下图所示: 不 ...
- 如果asp.net mvc中某个action被执行了两次,请检查是不是以下的原因
注释 <link rel="icon" href="#"> 这一句后试试
- python , angular js 学习记录【1】
1.日期格式化 Letter Date or Time Component Presentation Examples G Era designator Text AD y Year Year 199 ...
- nginx error_log 错误日志配置说明
nginx的error_log类型如下(从左到右:debug最详细 crit最少): [ debug | info | notice | warn | error | crit ] 例如:error_ ...
- C# 委托及各种写法
委托是神马? 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法).通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法, ...
- 【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线
本文转自:http://www.cnblogs.com/top15from/p/4899954.html ZBUS = MQ + RPC + PROXY 支持消息队列, 发布订阅, RPC, 代理(T ...
- GitHub for windows呆瓜级入门
一.GitHub是一个远程数据托管平台,对于代码用于版本控制(保存各个阶段的代码版本).首先去 https://github.com/ 注册一个GitHub账号 二.输入用户名(不能重复,相当于在Gi ...
- 【目录】python
python 入门学习(一) 入门学习(二) 入门学习(三) 入门学习(四) 入门学习(五) 入门学习(六) 入门学习(七) 入门学习(八) 入门学习(九) 入门学习(十) Head First Py ...
- IE 中单元格的 colspan 属性在某些情况下会影响 TABLE 元素的自动布局
今天在写一个jsp页面时,遇到一个如下的问题:在一个table中写了如下内容,table中定义了4列,在firefox中能正常显示,而在ie8中,显示不正常, 如下如图1:第二,三,四列宽度发生变化, ...
- python习题 (1):login
#!/uer/bin/env python # _*_ coding: utf-8 _*_ import sys retry_limit = 3 retry_count = 0 account_fil ...