此题代码量较大。。但是打起来很爽

原本不用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]染色--线段树+树链剖分的更多相关文章

  1. [BZOJ2243][SDOI2011]染色 解题报告|树链剖分

    Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...

  2. [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2243 线段树+树链剖分,在线段树需要每次用lt和rt两个数组记录当前区间的左右边界的颜色 ...

  3. BZOJ2243 SDOI2011 染色 【树链剖分】

    BZOJ2243 SDOI2011 染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色 ...

  4. bzoj2243[SDOI2011]染色 树链剖分+线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9012  Solved: 3375[Submit][Status ...

  5. BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)

    题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...

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

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 7925  Solved: 2975[Submit][Status ...

  7. BZOJ2243: [SDOI2011]染色(树链剖分/LCT)

    Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如 ...

  8. 【树链剖分】bzoj2243 [SDOI2011]染色

    树链剖分模板题.线段树维护每个段中的颜色数.左端点颜色.右端点颜色. pushup: col[rt]=col[rt<<1]+col[rt<<1|1]-(Rcol[rt<& ...

  9. [BZOJ2243][SDOI2011]染色(树链剖分)

    [传送门] 树链剖分就行了,注意线段树上颜色的合并 Code #include <cstdio> #include <algorithm> #define N 100010 # ...

随机推荐

  1. PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据

    如题,PHP如何自动识别第三方Restful API的内容,自动渲染成 json.xml.html.serialize.csv.php等数据? 其实这也不难,因为Rest API也是基于http协议的 ...

  2. 【转】8G内存下MySQL的优化详细方案

    对于任何一个数据库管理系统来说,内存的分配使用绝对可以算的上是其核心之一了,所以很多希望更为深入了解某数据库管理系统的人,都会希望一窥究竟,我也不例外. 这里给出方案 按照下面的设置试试看: key_ ...

  3. Python cumsums和cumprod函数

    >>>a = np.array([1,2,3],[4,5,6]]) >>>a array([[1,2,3], [4,5,6]]) >>>a.cum ...

  4. Python转码问题的解决方法:UnicodeDecodeError:‘gbk' codec can't decode bytes in position

    在开发过程中遇到了错误:UnicodeDecodeError: ‘gbk' codec can't decode bytes in position 678-679...这是因为遇到了非法字符, 解决 ...

  5. Fedora中允许mysql远程访问的几种方式

    Fedora中允许mysql远程访问,可以使用以下两种方式:a.改表. mysql>use mysql; mysql>update user set host = '%' where us ...

  6. 用DateTime的ParseExact方法解析特殊的日期时间

    今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [07-13 15:50:42] 主要问题是这个时间不是标准的时间,而是自定义的格式,即开头是月-日,然后是时间. 使用最 ...

  7. 无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]

    这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果 ...

  8. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  9. 自己总结SVN必知点

    1.只有添加或删除文件,才与xcodeproj文件有关 2.本地新建文件,为未知文件,符号为问号?,添加文件先add为A文件后,再commit         3.删除文件为叹号,右键删除为D,删除本 ...

  10. hdfs的读写数据流

    hdfs的读:      首先客户端通过调用fileSystem对象中的open()函数读取他需要的的数据,fileSystem是DistributedFileSystem的一个实例, Distrib ...