其实没什么难的,关键就是细节很重要、

注意树链剖分跳重链时是要手动判断top和top的父亲的、

另外work的时候用dui【】操作。、、、、

码:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
#define N 200005
vector<int>v[N];
int d[N],fu[N],op,sz[N],ans,woc[N],ys[N],n,m,he[N<<2],rs[N<<2],zys[N<<2],yys[N<<2],i,x,y,a,b,c,hson[N],dui[N],top[N],tot,lys,rys;
char ch;
void dfs1(int now,int fa,int shen)
{d[now]=shen;fu[now]=fa;sz[now]=1;for(int i=0;i<v[now].size();i++) {int nd=v[now][i];if(nd==fa)continue;dfs1(nd,now,shen+1);sz[now]+=sz[nd];if(sz[hson[now]]<sz[nd])hson[now]=nd;        }
}
void dfs2(int now,int tap)
{top[now]=tap;dui[now]=++tot;ys[tot]=woc[now];//yys[tot]=ys[now];if(hson[now]!=0)dfs2(hson[now],tap);for(int i=0;i<v[now].size();i++){int nd=v[now][i];if(nd==fu[now]||nd==hson[now])continue;dfs2(nd,nd);                }
}
void up(int o)
{int ll=o<<1;int rr=o<<1|1;he[o]=he[ll]+he[rr];zys[o]=zys[ll];yys[o]=yys[rr];if(zys[rr]==yys[ll])he[o]--;
}
void down(int o)
{int ll=o<<1;int rr=o<<1|1;if(rs[o]!=-1){he[ll]=1;he[rr]=1;rs[ll]=rs[o];rs[rr]=rs[o];zys[ll]=rs[o];yys[ll]=rs[o];zys[rr]=rs[o];yys[rr]=rs[o];    rs[o]=-1;}
}
void jian(int o,int l,int r)
{rs[o]=-1;if(l==r){he[o]=1;zys[o]=ys[l];yys[o]=ys[l];return;  }   int mid=(l+r)>>1;jian(zuo);jian(you);   up(o);
}
void gai(int o,int l,int r)
{if(a<=l&&b>=r){if(op==1){            he[o]=1;rs[o]=c;zys[o]=c;yys[o]=c;  }if(op==2){ans+=he[o];if(lys==-1)lys=zys[o];else{if(rys==zys[o])--ans;     }           rys=yys[o];}if(op==3){if(yys[o]==lys)--ans;lys=-1;}return;}down(o);int mid=(l+r)>>1;if(a<=mid)gai(zuo);if(b>mid)gai(you);
up(o);
}
void work(int x,int y)
{
ans=0;
lys=-1;
rys=-1;while(top[x]!=top[y]){if(d[top[x]]>d[top[y]])swap(x,y);if(op==1){a=dui[top[y]];b=dui[y];gai(1,1,tot);           }else{a=dui[top[y]];b=dui[y];gai(1,1,tot);    op=3;a=dui[fu[top[y]]];b=dui[fu[top[y]]];gai(1,1,tot);op=2;}y=fu[top[y]];      }if(d[y]<d[x])swap(x,y);a=dui[x];b=dui[y];gai(1,1,tot);
}
int main()
{scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&woc[i]);for(i=1;i<n;i++){scanf("%d%d",&x,&y);v[x].push_back(y);v[y].push_back(x);  }dfs1(1,1,1);dfs2(1,1);jian(1,1,tot);
for(int i=1;i<=m;i++)
{scanf("%c",&ch);while(ch!='Q'&&ch!='C')scanf("%c",&ch);if(ch=='Q'){scanf("%d%d",&x,&y);op=2;work(x,y);    printf("%d\n",ans);}else{scanf("%d%d%d",&x,&y,&c);op=1;work(x,y);  }
}
}

2017.6.23 染色 思考记录相关推荐

  1. 2017.9.5 组合数学 思考记录

    这题风格很正统.所以我感觉如果自己能不靠题解把这个题做出来,那应该就学得不错了.. 于是在历尽千辛万苦之后,终于1A了.(事后证明 结论题的结论强行无视 乱搞也是有可能AC的) xym&ISA ...

  2. 2017.9.4 Nim 思考记录

    只要知道nim的结论   这题就是链剖板子题.1A 注意bzoj 的  换行符是     \r!!      \r!!      \r!! 就说一下链剖的易错点吧: 1.记录父节点.sz.深度 2.当 ...

  3. 2017.10.28 排序 思考记录

    这个题有一种套路,就是大小关系转化成01串,这样就变成了二分检验问题,, 就是把排序变成区间修改,然后单点查询.. 把所有比他小的赋成0,比他大的赋成1 然后判断要求位是0还是1来判断答案与当前值的大 ...

  4. 2017.10.28 压缩 思考记录

    这个题首先要知道M和R不是栈的搭配,是贪心的搭配,,就是向左找到第一个M.. 如 abababab cdcdcdcd abababab cdcdcdcd   = abRRcdcdcdcdR != Ma ...

  5. 2017.10.6 单词 思考记录

    少有的会做的ac自动机题 .这个题是匹配模式串. 所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑 由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路 ...

  6. 2017.10.5 高速公路 思考记录

    ..一开始死活不知道样例8/3是怎么算出来的.. 后来才发现右端点要-1.. 这个题说是期望,但因为每个点的概率相同,所以直接求和然后除就可以了 维护每个区间的答案,听说直接维护答案很难写,,感觉还可 ...

  7. 2017.10.1 蚯蚓 思考记录

    现在看来这个题真心不难. 如果能保证一个从大到小的顺序的话,对所有的数依次进行相同比例的分裂操作,左右两边一定也是单调的 由于每次要+q,等价于取出元素-q,这在式子里是不影响大小关系的 所以就sor ...

  8. 2017.9.28 产品加工 思考记录

    很早之前做的了.发现bzoj上竟然没提交过 于是又重推了一遍 首先这个ti<=5是用来让n^2的复杂度降一降的, 然后就考虑装每个物品之后各个机器的耗时,同时,对于一个A机器的耗时,可能会有多个 ...

  9. 2017.9.28 降雨量 思考记录

    论逻辑清晰的重要性. 首先大小的关系明摆着是要你建一颗线段树 然后就可以分类讨论了 x没有 y有 x有 y没有 x没有 y没有 x有 y有 对于都没有的情况  只可能是maybe 对于一个没有的情况, ...

最新文章

  1. Java Arrays.Sort方法重写
  2. 031_jQuery Ajax的post方法
  3. solidity编码规范
  4. 位操作的应用:判断一个数是不是2的幂数,实现循环移位【位操作】(55)
  5. UNITY 画布的粗浅理解
  6. python mysql 性能监控_MySQL性能监控工具 orzdba python版本
  7. An unspecified error occurred!
  8. XML解组基准:JAXB,STAx,Woodstox
  9. where in的sql语句按照指定ID进行排序的解决方法
  10. 2012年7月份第4周51Aspx源码发布详情
  11. Vue.js入门系列教程(二)
  12. LeetCode 123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
  13. mysql 大表查询慢_mysql大表查询慢怎么优化?
  14. 文本文件以EF BB开头,使用UTF8读取
  15. opporeno怎么刷鸿蒙系统,opporeno老是提示更新系统
  16. 计算小于100的最大素数
  17. ****you do not have the permissions necessary t...
  18. 机械臂C语言编程,ROS下C++控制UR机械臂
  19. 企业应用层面知识管理咨询方法
  20. 论文分享 | 罗强等:GIS领域知识图谱进展研究

热门文章

  1. 用户登录python_python用户登录系统
  2. 数据库创建联合主键(MySql)
  3. 高等组合学笔记(八):第一类Stirling数, 整数分拆
  4. Sublime中查找重复行的正则表达式
  5. LeetCode-76: 最小覆盖子串
  6. Go语言获取文件的文件路径、文件名、扩展名
  7. 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...
  8. 计算机无法启动windows无线服务,win10无线服务无法启动怎么解决
  9. aftool刷工具提示15天_【15天】【指数600+】关键词百度首页【实战分析】【面授学员】...
  10. android用java写文本框_Android 使用TextView实现验证码输入框