HYSBZ 2243(染色)
题目链接:传送门
题目大意:中文题,略
题目思路:树链剖分,区间更新,区间查询。
闲谈: 只想说这道题做的好苦逼。。去长春现场赛之前就没A,回来后又做了2天才A掉,蒟蒻太菜了
这道题也没有想象中那么难,就是代码有点长。。
在查询的时候注意判断端点交界处如果相同则答案-1。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 30010
typedef pair<int,int> PII;
typedef long long LL;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,sz,L,R;
int a[N],mrk[N<<];
struct Seg{int l,r,v;}seg[N<<];
int son[N],siz[N],id[N],tid,posi[N];
int top[N],fa[N],dep[N],head[N],hcnt;
struct Node{int to,nxt;}node[N<<];
void dfs1(int u,int f,int deep){
dep[u]=deep,fa[u]=f,siz[u]=;
for(int i=head[u];~i;i=node[i].nxt){
int e=node[i].to;
if(e==f)continue;
dfs1(e,u,deep+);
siz[u]+=siz[e];
if(!son[u]||siz[son[u]]<siz[e])
son[u]=e;
}
}
void dfs2(int u,int tp){
top[u]=tp,id[u]=++tid,posi[tid]=u;
if(!son[u])return;dfs2(son[u],tp);
for(int i=head[u];~i;i=node[i].nxt){
int e=node[i].to;
if(!id[e])dfs2(e,e);
}
}
void pushdown(int rt){
seg[rt<<].v=seg[rt<<|].v=;
seg[rt<<].l=seg[rt<<].r=mrk[rt];
seg[rt<<|].l=seg[rt<<|].r=mrk[rt];
mrk[rt<<]=mrk[rt<<|]=mrk[rt];mrk[rt]=-;
}
int query(int rt,int l,int r){
if(L<=l&&r<=R)return seg[rt].v;
int mid=l+r>>,temp=,t1=-,t2=-;
if(~mrk[rt])pushdown(rt);
if(L<=mid)t1=seg[rt<<].r,temp+=query(lson);
if(R>mid) t2=seg[rt<<|].l,temp+=query(rson);
seg[rt].l=seg[rt<<].l,seg[rt].r=seg[rt<<|].r;
seg[rt].v=seg[rt<<].v+seg[rt<<|].v-(seg[rt<<].r==seg[rt<<|].l);
temp-=(t1==t2&&t1!=-);
return temp;
}
void update(int rt,int l,int r,int v){
if(L<=l&&r<=R){seg[rt].v=,seg[rt].l=seg[rt].r=mrk[rt]=v;return;}
int mid=l+r>>;
if(~mrk[rt])pushdown(rt);
if(L<=mid)update(lson,v);
if(R>mid) update(rson,v);
seg[rt].l=seg[rt<<].l,seg[rt].r=seg[rt<<|].r;
seg[rt].v=seg[rt<<].v+seg[rt<<|].v-(seg[rt<<].r==seg[rt<<|].l);
}
int findp(int rt,int l,int r,int L){
if(l==r)return seg[rt].l;
int mid=l+r>>,temp;
if(~mrk[rt])pushdown(rt);
if(L<=mid)return findp(lson,L);
else return findp(rson,L);
}
void lca(int x,int y){
int res=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
L=id[top[x]],R=id[x];
res+=query(,,n);
L=id[x];
if(findp(,,n,id[top[x]])==findp(,,n,id[fa[top[x]]]))--res; ///看两端是否相同
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
L=id[x],R=id[y];
res+=query(,,n);
printf("%d\n",res);
}
void change(int x,int y,int v){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
L=id[top[x]],R=id[x];
update(,,n,v);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
L=id[x],R=id[y];
update(,,n,v);
}
void build(int rt,int l,int r){
if(l==r){seg[rt].l=seg[rt].r=a[posi[l]],seg[rt].v=;return;}
int mid=l+r>>;
build(lson);build(rson);
seg[rt].v=seg[rt<<].v+seg[rt<<|].v-(seg[rt<<].r==seg[rt<<|].l);
seg[rt].l=seg[rt<<].l,seg[rt].r=seg[rt<<|].r;
}
int main(){
int i,j,group,x,y,v;
n=read(),m=read();mst(head,-);mst(mrk,-);
for(i=;i<=n;++i)a[i]=read();
for(i=;i<n;++i){
x=read(),y=read();
node[hcnt].to=y;node[hcnt].nxt=head[x],head[x]=hcnt++;
node[hcnt].to=x,node[hcnt].nxt=head[y],head[y]=hcnt++;
}
dfs1(,,);dfs2(,);build(,,n);
char ch;
while(m--){
scanf(" %c",&ch);
x=read(),y=read();
if(ch=='Q') lca(x,y);
else v=read(),change(x,y,v);
}
return ;
}
HYSBZ 2243(染色)的更多相关文章
- hysbz 2243 染色(树链剖分)
题目链接:hysbz 2243 染色 题目大意:略. 解题思路:树链剖分+线段树的区间合并,可是区间合并比較简单,节点仅仅要记录左右端点的颜色就可以. #include <cstdio> ...
- HYSBZ 2243 染色 (树链拆分)
主题链接~~> 做题情绪:这题思路好想.调试代码调试了好久.第一次写线段树区间合并. 解题思路: 树链剖分 + 线段树区间合并 线段树的端点记录左右区间的颜色.颜色数目.合并的时候就用区间合并的 ...
- HYSBZ - 2243 染色 (树链剖分+线段树)
题意:树上每个结点有自己的颜色,支持两种操作:1.将u到v路径上的点颜色修改为c; 2.求u到v路径上有多少段不同的颜色. 分析:树剖之后用线段树维护区间颜色段数.区间查询区间修改.线段树结点中维护的 ...
- HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分
树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...
- HYSBZ 2243
//Accepted 18440 KB 5556 ms /* source:HYSBZ 2243 time :2015.5.29 by :songt */ /*题解: 树链剖分 */ #include ...
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- HDU 3966 & POJ 3237 & HYSBZ 2243 & HRBUST 2064 树链剖分
树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...
- BZOJ 2243 染色 (线段树+树链剖分)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 9895 Solved: 3735[Submit][Status ...
- BZOJ 2243 染色(树链剖分好题)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 7971 Solved: 2990 [Submit][Stat ...
随机推荐
- /usr/lib64改名字风波
注:本文描述请勿模仿,仅限万一遇到这种情况一试. 一不小心做了一个操作: cd /usr mv lib64 lib64-bak 然后奇异的发现: cp不能用了!ls也不能用了…… 提示信息如下: -b ...
- screen常用命令
1. 背景 由于经常使用ssh登录实验室的服务器训练神经网络, 而一些复杂的神经网络模型需要长时间训练,在此期间,如果出现网络等原因出现链接中断的话,服务器的进程也会被杀死,之前的一切半途而废.利用s ...
- bootstrap-fileinput文件上传组件和laravel引用(未完)
前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...
- Android - 资源(resource)转换为String
资源(resource)转换为String 本文地址: http://blog.csdn.net/caroline_wendy Android建议资源的动态绑定, 即把string写入资源内, 然后运 ...
- IOS7 隐藏状态栏 (电池栏)
电池状态栏. //方法一(代码设置): 现在ios7已经更改为透明,并且不占用屏幕高度.其中隐藏及显示的方法如下: 在uiviewcontroller的子类下,调用: if ([self re ...
- spring boot热部署pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 【持续更新】GDB使用笔记
多文件程序的调试,例子: 文件结构: /demo Makefile /src demo.cpp util.cpp /include util.h 截图: ----------------------- ...
- xslt 映射 xml
1.xslt文件映射xml文件中的A节点的时候,如果A节点有属性的话,先把属性值映射出来,然后再映射节点的值,如下: xml文件: <A age="11" sex=" ...
- PDF文件的加载及展示
项目需要显示PDF文件,于是遍寻了网络,发现的方法以下几种: 1.使用UIWebView加载,没啥说的,根据文件路径,网络或者本地皆可,创建一个NSURLRequest,然后用webView加载就可以 ...
- 卖座网一处SQL注射(Http Referer sqlinjection)
漏洞作者: 猪猪侠 漏洞详情 披露状态: 2015-01-13: 细节已通知厂商并且等待厂商处理中2015-01-14: 厂商已经确认,细节仅向厂商公开2015-01-24: 细节向核心白帽子及相关领 ...