题目链接:

2243: [SDOI2011]染色

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 6267  Solved: 2291

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,表示xy之间有一条无向边。

下面 行每行描述一个操作:

“C a b c”表示这是一个染色操作,把节点a到节点b路径上所有点(包括a和b)都染成颜色c;

“Q a b”表示这是一个询问操作,询问节点a到节点b(包括a和b)路径上的颜色段数量。

Output

对于每个询问操作,输出一行答案。

Sample Input

6 5

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

3

1

2

HINT

数N<=10^5,操作数M<=10^5,所有的颜色C为整数且在[0, 10^9]之间。

题意:

思路:

树链剖分的入门题?反正上次写hdu边那个一个T,今天写这个点的版本的还好;调了一会就过了;

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lson o<<1
#define rson o<<1|1
const int maxn=1e5+10;
int n,m,a[maxn];
int siz[maxn],dep[maxn],fa[maxn],son[maxn],top[maxn],tid[maxn],Rank[maxn],tim=0;
vector<int>ve[maxn];
void dfs1(int cur,int father,int deep)
{
fa[cur]=father;
siz[cur]=1;
dep[cur]=deep;
int len=ve[cur].size();
for(int i=0;i<len;i++)
{
int x=ve[cur][i];
if(x==father)continue;
dfs1(x,cur,deep+1);
siz[cur]+=siz[x];
if(son[cur]==-1||siz[x]>siz[son[cur]])son[cur]=x;
}
}
void dfs2(int cur,int tp)
{
top[cur]=tp;
tid[cur]=++tim;
Rank[tim]=cur;
if(son[cur]==-1)return ;
dfs2(son[cur],tp);
int len=ve[cur].size();
for(int i=0;i<len;i++)
{
int x=ve[cur][i];
if(x==fa[cur]||x==son[cur])continue;
dfs2(x,x);
}
}
struct Tree
{
int l,r,sum,lc,rc,mark;
}tr[maxn*4];
inline void pushup(int o)
{
tr[o].sum=tr[lson].sum+tr[rson].sum;
tr[o].lc=tr[lson].lc;tr[o].rc=tr[rson].rc;
if(tr[lson].rc==tr[rson].lc)tr[o].sum--;
}
inline void pushdown(int o)
{
if(tr[o].mark>=0)
{
tr[lson].sum=tr[rson].sum=1;
tr[lson].lc=tr[lson].rc=tr[o].mark;
tr[rson].lc=tr[rson].rc=tr[o].mark;
tr[lson].mark=tr[rson].mark=tr[o].mark;
tr[o].mark=-1;
}
}
void build(int o,int L,int R)
{
tr[o].l=L;tr[o].r=R;
tr[o].mark=-1;
if(L>=R)
{
tr[o].sum=1;
tr[o].lc=tr[o].rc=a[Rank[L]];
return ;
}
int mid=(L+R)>>1;
build(lson,L,mid);
build(rson,mid+1,R);
pushup(o);
}
void update(int o,int L,int R,int num)
{
if(L<=tr[o].l&&R>=tr[o].r)
{
tr[o].sum=1;
tr[o].lc=tr[o].rc=num;
tr[o].mark=num;
return ;
}
int mid=(tr[o].l+tr[o].r)>>1;
pushdown(o);
if(L<=mid)update(lson,L,R,num);
if(R>mid)update(rson,L,R,num);
pushup(o);
}
int query(int o,int L,int R,int & Lc,int & Rc)
{
if(L<=tr[o].l&&R>=tr[o].r)
{
if(L==tr[o].l)Lc=tr[o].lc;
if(R==tr[o].r)Rc=tr[o].rc;
return tr[o].sum;
}
int mid=(tr[o].l+tr[o].r)>>1;
pushdown(o);
if(R<=mid)return query(lson,L,R,Lc,Rc);
else if(L>mid)return query(rson,L,R,Lc,Rc);
else
{
int ans=query(lson,L,R,Lc,Rc)+query(rson,L,R,Lc,Rc);
if(tr[lson].rc==tr[rson].lc)ans--;
return ans;
}
} void change(int u,int v,int w)
{
int fu=top[u],fv=top[v]; while(fu!=fv)
{
if(dep[fu]<dep[fv])swap(u,v),swap(fu,fv);
update(1,tid[fu],tid[u],w);
u=fa[fu];
fu=top[u];
}
if(dep[u]<dep[v])swap(u,v);
update(1,tid[v],tid[u],w);
}
int solve(int u,int v)
{
int ans=0,fu=top[u],fv=top[v];
int preul=-1,preur=-1,prevl=-1,prevr=-1;
int nowul=-1,nowur=-1,nowvl=-1,nowvr=-1;
while(fu!=fv)
{
if(dep[fu]>dep[fv])
{
ans+=query(1,tid[fu],tid[u],nowul,nowur);
if(nowur==preul&&preul!=-1)ans--;
preul=nowul;preur=nowur;
u=fa[fu];
fu=top[u];
}
else
{
ans+=query(1,tid[fv],tid[v],nowvl,nowvr);
if(nowvr==prevl&&prevl!=-1)ans--;
prevl=nowvl;prevr=nowvr;
v=fa[fv];
fv=top[v];
}
}
if(dep[u]>dep[v])
{
ans+=query(1,tid[v],tid[u],nowul,nowur);
if(nowur==preul&&preul!=-1)ans--;
if(nowul==prevl&&prevl!=-1)ans--;
}
else
{
ans+=query(1,tid[u],tid[v],nowvl,nowvr);
if(nowvr==prevl&&prevl!=-1)ans--;
if(nowvl==preul&&preul!=-1)ans--;
}
return ans;
}
int main()
{
int u,v,w;
char s[5];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
ve[u].push_back(v);
ve[v].push_back(u);
}
memset(son,-1,sizeof(son));
dfs1(1,0,0);
dfs2(1,1);
build(1,1,n);
while(m--)
{
scanf("%s%d%d",s,&u,&v);
if(s[0]=='C')
{
scanf("%d",&w);
change(u,v,w);
}
else printf("%d\n",solve(u,v));
}
return 0;
}

  

bzoj-2243 2243: [SDOI2011]染色(树链剖分)的更多相关文章

  1. BZOJ 2243: [SDOI2011]染色 [树链剖分]

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

  2. Bzoj 2243: [SDOI2011]染色 树链剖分,LCT,动态树

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

  3. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

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

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

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2243 树链剖分的点剖分+线段树.漏了一个小地方,调了一下午...... 还是要细心啊! 结 ...

  6. [bzoj 2243]: [SDOI2011]染色 [树链剖分][线段树]

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

  7. 2243: [SDOI2011]染色(树链剖分+线段树)

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

  8. 2243: [SDOI2011]染色 树链剖分+线段树染色

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

  9. POJ 2243 [SDOI2011]染色 | 树链剖分+线段树

    原题链接 肯定是树链剖分的题啦 树剖怎么做可以看我上一篇博客 如果我们已经剖完了: 然后考虑怎么维护重链和查询 用线段树维护的时候当前区间的区间颜色个数应该等于左儿子+右儿子,但是当左儿子的右端点和右 ...

随机推荐

  1. 10个最好的 JavaScript 动画库和开发框架

    虽然 CSS3 动画功能能够让我们以简单轻松的方式实现动画效果,但是浏览器兼容性问题让人头疼.不过不用担心,我们还有另外的武器——JavaScript,它同样可以帮助你实现各种各样的动画效果,而且借助 ...

  2. canvas画布在主流浏览器中的尺寸限制

    通过测试发现,canvas在不同浏览器下面有不同的最大尺寸限制. 大家都知道,canvas有自身的width,height属性来控制尺寸,用css的width,height,控制显示的大小.可以理解为 ...

  3. SAP ALV内嵌(In-place)Excel的问与答

    1.问题:点击ALV工具栏的"Excel"图标后,出现空白的内嵌Excel界面,无法正常显示报表数据.可按以下思路解决:(1)检查Excel中的宏安全设置选项.访问方法:启动Exc ...

  4. Snort - manual 笔记(四)

    1.7 Basic Output Snort可以做很多任务, 并且在任务完成后输出很多有用的统计信息. 一些不用说明就可以看懂, 其他的总结在这里, 不过只是一些基本的 1.7.1 Timing St ...

  5. WCF服务配置编辑器使用

    学习wcf,特别是初学者,配置文件很难搞懂,有点复杂,自己手动配置哪有这么多精力啊,这不是吃的太饱了吗,所以学会使用配置编辑器是必须的,下面是学习的流程图. 打开工具的wcf服务配置编辑器,点击文件= ...

  6. iOS 被拒问题及原因 - IDFA问题

    IDFA问题 iOS APP上线被拒绝的问题解决(AdSupport),百度统计,友盟统计,讯飞语音等   苹果反馈信息如下: .... To process your delivery, the f ...

  7. 浅谈自定义UITextField的方法

    观察效果图 UITextField有以下几种特点: 1.默认占位文字是灰色的 2.当光标点上去时,占位文字变为白色 3.光标是白色的 接下来我们通过不同的方法来解决问题 一.将xib中的UITextF ...

  8. EMC Documentum DQL整理(三)

    1.Get Content Size in folder SELECT SUM(r_full_content_size/1024.0) FROM dm_sysobject WHERE FOLDER(' ...

  9. 资源list:Github上关于大数据的开源项目、论文等合集

    Awesome Big Data A curated list of awesome big data frameworks, resources and other awesomeness. Ins ...

  10. ADO.Net(四)——扩展属性和配置文件应用

    一.扩展属性 处理:有外键关系时将代号化信息处理成原始文字,让用户可看懂的(粗略解释) 利用扩展属性 如:Info表中的民族列显示的是民族代号处理成Nation表中的民族名称 需要在Info类里面扩展 ...