2017.6.23 染色 思考记录
其实没什么难的,关键就是细节很重要、
注意树链剖分跳重链时是要手动判断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 染色 思考记录相关推荐
- 2017.9.5 组合数学 思考记录
这题风格很正统.所以我感觉如果自己能不靠题解把这个题做出来,那应该就学得不错了.. 于是在历尽千辛万苦之后,终于1A了.(事后证明 结论题的结论强行无视 乱搞也是有可能AC的) xym&ISA ...
- 2017.9.4 Nim 思考记录
只要知道nim的结论 这题就是链剖板子题.1A 注意bzoj 的 换行符是 \r!! \r!! \r!! 就说一下链剖的易错点吧: 1.记录父节点.sz.深度 2.当 ...
- 2017.10.28 排序 思考记录
这个题有一种套路,就是大小关系转化成01串,这样就变成了二分检验问题,, 就是把排序变成区间修改,然后单点查询.. 把所有比他小的赋成0,比他大的赋成1 然后判断要求位是0还是1来判断答案与当前值的大 ...
- 2017.10.28 压缩 思考记录
这个题首先要知道M和R不是栈的搭配,是贪心的搭配,,就是向左找到第一个M.. 如 abababab cdcdcdcd abababab cdcdcdcd = abRRcdcdcdcdR != Ma ...
- 2017.10.6 单词 思考记录
少有的会做的ac自动机题 .这个题是匹配模式串. 所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑 由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路 ...
- 2017.10.5 高速公路 思考记录
..一开始死活不知道样例8/3是怎么算出来的.. 后来才发现右端点要-1.. 这个题说是期望,但因为每个点的概率相同,所以直接求和然后除就可以了 维护每个区间的答案,听说直接维护答案很难写,,感觉还可 ...
- 2017.10.1 蚯蚓 思考记录
现在看来这个题真心不难. 如果能保证一个从大到小的顺序的话,对所有的数依次进行相同比例的分裂操作,左右两边一定也是单调的 由于每次要+q,等价于取出元素-q,这在式子里是不影响大小关系的 所以就sor ...
- 2017.9.28 产品加工 思考记录
很早之前做的了.发现bzoj上竟然没提交过 于是又重推了一遍 首先这个ti<=5是用来让n^2的复杂度降一降的, 然后就考虑装每个物品之后各个机器的耗时,同时,对于一个A机器的耗时,可能会有多个 ...
- 2017.9.28 降雨量 思考记录
论逻辑清晰的重要性. 首先大小的关系明摆着是要你建一颗线段树 然后就可以分类讨论了 x没有 y有 x有 y没有 x没有 y没有 x有 y有 对于都没有的情况 只可能是maybe 对于一个没有的情况, ...
最新文章
- Java Arrays.Sort方法重写
- 031_jQuery Ajax的post方法
- solidity编码规范
- 位操作的应用:判断一个数是不是2的幂数,实现循环移位【位操作】(55)
- UNITY 画布的粗浅理解
- python mysql 性能监控_MySQL性能监控工具 orzdba python版本
- An unspecified error occurred!
- XML解组基准:JAXB,STAx,Woodstox
- where in的sql语句按照指定ID进行排序的解决方法
- 2012年7月份第4周51Aspx源码发布详情
- Vue.js入门系列教程(二)
- LeetCode 123. 买卖股票的最佳时机 III(Best Time to Buy and Sell Stock III)
- mysql 大表查询慢_mysql大表查询慢怎么优化?
- 文本文件以EF BB开头,使用UTF8读取
- opporeno怎么刷鸿蒙系统,opporeno老是提示更新系统
- 计算小于100的最大素数
- ****you do not have the permissions necessary t...
- 机械臂C语言编程,ROS下C++控制UR机械臂
- 企业应用层面知识管理咨询方法
- 论文分享 | 罗强等:GIS领域知识图谱进展研究
热门文章
- 用户登录python_python用户登录系统
- 数据库创建联合主键(MySql)
- 高等组合学笔记(八):第一类Stirling数, 整数分拆
- Sublime中查找重复行的正则表达式
- LeetCode-76: 最小覆盖子串
- Go语言获取文件的文件路径、文件名、扩展名
- 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...
- 计算机无法启动windows无线服务,win10无线服务无法启动怎么解决
- aftool刷工具提示15天_【15天】【指数600+】关键词百度首页【实战分析】【面授学员】...
- android用java写文本框_Android 使用TextView实现验证码输入框