bzoj2243:[SDOI2011]染色
链剖就可以了。一开始的想法错了。但也非常接近了。妈呀调的要死。。。然后把字体再缩小一号查错起来比较容易QAQ。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define qwq(x) for(edge *o=head[x];o;o=o->next)
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f;
struct edge{
int to;edge *next;
};
edge es[nmax<<1],*pt=es,*head[nmax];
void add(int u,int v){
pt->to=v;pt->next=head[u];head[u]=pt++;
pt->to=u;pt->next=head[v];head[v]=pt++;
}
int n,m,fa[nmax],son[nmax],dep[nmax],size[nmax],tp[nmax],id[nmax],idx[nmax],w[nmax];
void dfs(int x){
size[x]=1;
qwq(x) if(o->to!=fa[x]){
int to=o->to;dep[to]=dep[x]+1,fa[to]=x;
dfs(o->to);size[x]+=size[to];
if(!son[x]||size[son[x]]<size[to]) son[x]=to;
}
}
void DFS(int x,int top){
tp[x]=top;id[++id[0]]=x;idx[x]=id[0];
if(son[x]) DFS(son[x],top);
qwq(x) if(!idx[o->to]) DFS(o->to,o->to);
} int lc[nmax<<2],rc[nmax<<2],sum[nmax<<2],col[nmax<<2];
void pushup(int x){
lc[x]=lc[x<<1];rc[x]=rc[x<<1|1];
sum[x]=sum[x<<1]+sum[x<<1|1]-(rc[x<<1]==lc[x<<1|1]);
}
void build(int l,int r,int x){
col[x]=-1;
if(l==r){
lc[x]=rc[x]=w[id[l]];sum[x]=1;return ;
}
int mid=(l+r)>>1;build(lson);build(rson);pushup(x);
}
void print(int l,int r,int x){
printf("%d->%d:%d %d %d %d\n",l,r,col[x],lc[x],rc[x],sum[x]);
if(l==r) return ;
int mid=(l+r)>>1;print(lson);print(rson);
}
void pushdown(int x){
if(col[x]!=-1){
col[x<<1]=col[x<<1|1]=col[x];
lc[x<<1]=rc[x<<1]=lc[x<<1|1]=rc[x<<1|1]=col[x];
sum[x<<1]=sum[x<<1|1]=1;col[x]=-1;
return ;
}
}
void update(int tl,int tr,int p,int l,int r,int x){
if(tl<=l&&tr>=r){
col[x]=p;lc[x]=rc[x]=p;sum[x]=1;return ;
}
int mid=(l+r)>>1;pushdown(x);
if(tl<=mid) update(tl,tr,p,lson);
if(tr>mid) update(tl,tr,p,rson);
pushup(x);
}
void UPDATE(int a,int b,int p){
while(tp[a]!=tp[b]){
if(dep[tp[a]]>dep[tp[b]]) swap(a,b);
update(idx[tp[b]],idx[b],p,1,n,1);
b=fa[tp[b]];
}
if(dep[a]>dep[b]) swap(a,b);
update(idx[a],idx[b],p,1,n,1);
}
int query(int tl,int tr,int l,int r,int x){
if(tl<=l&&tr>=r) return sum[x];
int mid=(l+r)>>1;pushdown(x);
if(tr<=mid) return query(tl,tr,lson);
if(tl>mid) return query(tl,tr,rson);
return query(tl,tr,lson)+query(tl,tr,rson)-(rc[x<<1]==lc[x<<1|1]);
}
int get(int p,int l,int r,int x){
//printf("%d %d %d\n",l,r,lc[x]);
if(l==r) return lc[x];
int mid=(l+r)>>1;pushdown(x);
return p<=mid?get(p,lson):get(p,rson);
}
void QUERY(int a,int b){
int ans=0;
while(tp[a]!=tp[b]){
if(dep[tp[a]]>dep[tp[b]]) swap(a,b);
ans+=query(idx[tp[b]],idx[b],1,n,1);
//printf("%d %d %d %d %d\n",ans,idx[fa[tp[b]]],get(idx[fa[tp[b]]],1,n,1),idx[tp[b]],get(idx[tp[b]],1,n,1));
if(get(idx[fa[tp[b]]],1,n,1)==get(idx[tp[b]],1,n,1)) ans--;
b=fa[tp[b]];
}
if(dep[a]>dep[b]) swap(a,b);
ans+=query(idx[a],idx[b],1,n,1);
printf("%d\n",ans);
}
int main(){
n=read(),m=read();
rep(i,1,n) w[i]=read();
int u,v,d;
rep(i,1,n-1) u=read(),v=read(),add(u,v);
clr(son,0);clr(idx,0);dep[1]=0;id[0]=0;
dfs(1);DFS(1,1);
//rep(i,1,n) printf("%d %d %d %d %d %d\n",fa[i],son[i],dep[i],size[i],tp[i],id[i]);
//rep(i,1,n) printf("%d ",id[i]);printf("\n"); build(1,n,1);
//print(1,n,1);
//get(2,1,n,1);
char s[5];
rep(i,1,m){
scanf("%s",s);u=read(),v=read();
if(s[0]=='C') d=read(),UPDATE(u,v,d);
else QUERY(u,v);
}
return 0;
}
2243: [SDOI2011]染色
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 5972 Solved: 2185
[Submit][Status][Discuss]
Description
给定一棵有n个节点的无根树和m个操作,操作有2类:
1、将节点a到节点b路径上所有点都染成颜色c;
2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。
请你写一个程序依次完成这m个操作。
Input
第一行包含2个整数n和m,分别表示节点数和操作数;
第二行包含n个正整数表示n个节点的初始颜色
下面 行每行包含两个整数x和y,表示x和y之间有一条无向边。
下面 行每行描述一个操作:
“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;
“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。
Output
对于每个询问操作,输出一行答案。
Sample Input
2 2 1 2 1 1
1 2
1 3
2 4
2 5
2 6
Q 3 5
C 2 1 1
Q 3 5
C 5 1 2
Q 3 5
Sample Output
1
2
HINT
数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。
Source
bzoj2243:[SDOI2011]染色的更多相关文章
- 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]染色
Description 给定一棵有$n$个节点的无根树和$m$个操作,操作有$2$类: 1.将节点$a$到节点$b$路径上所有点都染成颜色$c$; 2.询问节点$a$到节点$b$路径上的颜色段数量(连 ...
- BZOJ2243[SDOI2011]染色——树链剖分+线段树
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221 ...
- [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
- BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)
题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...
- BZOJ2243: [SDOI2011]染色(树链剖分/LCT)
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如 ...
- bzoj2243: [SDOI2011]染色--线段树+树链剖分
此题代码量较大..但是打起来很爽 原本不用lca做一直wa不知道为什么.. 后来改lca重打了一遍= =结果一遍就AC了orz 题目比较裸,也挺容易打,主要是因为思路可以比较清晰 另:加读入优化比没加 ...
- BZOJ2243——[SDOI2011]染色
1.题目大意:给个树,然后树上每个点都有颜色,然后会有路径的修改,有个询问,询问一条路径上的颜色分成了几段 2.分析:首先这个修改是树剖可以做的,对吧,但是这个分成了几段怎么搞呢,我们的树剖的不是要建 ...
- bzoj2243 sdoi2011 染色 paint
明明是裸树剖 竟然调了这么久好蛋疼 大概是自己比较水的原因吧 顺便+fastio来gangbang #include<iostream> #include<cstring> # ...
随机推荐
- php curl 伪造IP来源的代码分享
php curl 可以模仿用户登录,还可以模仿用户IP地址.伪造IP来源. 1,curl发出请求的文件fake_ip.php: <?php $ch = curl_init(); $url = & ...
- C# 学习之旅(1)
第一, 输入输出流都来自控制台. using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- Windows api 函数全部列表 (未完成)
网上找了很久,发现没有完整版的,msdn上面有,但是不方便查阅,所以想自己整理一下:由于工程量过于庞大,希望大家共同完成.MSDN:http://msdn.microsoft.com/en-us/li ...
- 2014年辛星完全解读Javascript第三节
经过第一节的入门和第二节的运算符,那么接下来我们就可以学习Javascript的函数了,当然了,不管大家之前学习的是什么编程语言,都会有函数的概念,如果大家学的是Pascal,还会有”过程“的概念,但 ...
- closest()一个在评论里很有用的函数
实例 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click", fu ...
- Spring execution 表达式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) th ...
- 【BZOJ2330】 [SCOI2011]糖果
Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 微软职位内部推荐-This Job is no longer available.
微软近期Open的职位: 如果你想试试这个职位,请跟我联系,我是微软的员工,可以做内部推荐.发你的中英文简历到我的邮箱:Nicholas.lu.mail(at)gmail.com
- mac 如何让文件隐藏
1.首先,要确保知道目标文件或文件夹的名称,你不把这个名称正确地输入到终端中,Mac也无能为力啊... 2.打开终端,输入chflags hidden 3.在上述代码的后面加上该文件夹的路径,但是注意 ...
- embed标签遮住div层
依然是上次的那个返工友情项目,当时帮忙用jquery ui写了一个漂浮的投票箱,就是类似点击一个项目然后就收藏到了投票箱中的效果.. 虽然不是很复杂,但是由于页面上有大面积的由kindeditor上传 ...