当前位置:网站首页>Logu P2486 [sdoi2011] coloring (tree chain + segment tree + merging of intervals on the tree)
Logu P2486 [sdoi2011] coloring (tree chain + segment tree + merging of intervals on the tree)
2022-06-25 08:02:00 【Mfy's little brother 1】
Luogu P2486 [SDOI2011] dyeing ( Tree chain + Line segment tree + Interval merging on tree )
The question :
Given a tree n Rootless tree with nodes , share m Operations , There are two kinds of operations :
The nodes a To the node b All points on the path of ( Include a and b) All dyed in color c.
Ask nodes a To the node b Number of color segments on the path of .
A color segment is defined as an extremely long continuous segment of the same color . for example 112221 It consists of three sections :11、222、1
Ideas :
When merging intervals on a tree , Consider the last boundary
#include <bits/stdc++.h>
using namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2e5+100;
int n,m,k,RC,LC,tot,a[maxn],siz[maxn],fa[maxn],son[maxn],id[maxn],idd[maxn],top[maxn],deep[maxn],lazy[maxn<<2];
vector<int>mp[maxn];
struct NODE{
ll ans,sum,ml,mr,l,r;
}tree[maxn<<2];
void dfs1(int x,int f,int d){
siz[x]=1;
fa[x]=f;
deep[x]=d;
son[x]=0;
for(auto y:mp[x]){
if(y==f)continue;
dfs1(y,x,d+1);
siz[x]+=siz[y];
if(siz[son[x]]<siz[y])son[x]=y;
}
}
void dfs2(int x,int root){
id[x]=++tot;
top[x]=root;
idd[tot]=a[x];
if(son[x])dfs2(son[x],root);
for(auto y:mp[x]){
if(y!=fa[x]&&y!=son[x])dfs2(y,y);
}
}
void pushup(int rt){
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
if(tree[rt<<1].mr==tree[rt<<1|1].ml)tree[rt].sum--;
tree[rt].ml=tree[rt<<1].ml,tree[rt].mr=tree[rt<<1|1].mr;
}
void pushdown(int rt){
if(lazy[rt]){
tree[rt<<1].ml=tree[rt<<1|1].mr=lazy[rt];
tree[rt<<1].mr=tree[rt<<1|1].ml=lazy[rt];
tree[rt<<1].sum=tree[rt<<1|1].sum=1;
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
lazy[rt]=0;
}
}
void build(int rt,int l,int r){
tree[rt].l=l,tree[rt].r=r;
if(l==r){
tree[rt].ml=tree[rt].mr=idd[l];
tree[rt].sum=1;
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void update(int rt,int x,int y,int c){
if(x<=tree[rt].l&&tree[rt].r<=y){
tree[rt].ml=tree[rt].mr=c;
tree[rt].sum=1;
lazy[rt]=c;
return;
}
pushdown(rt);
int mid=(tree[rt].l+tree[rt].r)>>1;
if(x<=mid)update(rt<<1,x,y,c);
if(y>mid)update(rt<<1|1,x,y,c);
pushup(rt);
}
NODE query(int rt,int x,int y,int xx,int yy){
if(x<=tree[rt].l&&tree[rt].r<=y){
if(tree[rt].l==xx)LC=tree[rt].ml;
if(tree[rt].r==yy)RC=tree[rt].mr;
return tree[rt];
}
int mid=(tree[rt].l+tree[rt].r)>>1;
pushdown(rt);
if(y<=mid)return query(rt<<1,x,y,xx,yy);
else if(x>mid)return query(rt<<1|1,x,y,xx,yy);
else{
NODE t,t1=query(rt<<1,x,mid,xx,yy),t2=query(rt<<1|1,mid+1,y,xx,yy);
t.ml=t1.ml;
t.mr=t2.mr;
t.sum=t1.sum+t2.sum;
if(t1.mr==t2.ml)t.sum--;
return t;
}
}
int getdis(int x,int y){
// The poem
int ans=0,pos1=0,pos2=0;//pos1 by x, Upper endpoint color of points with large depth
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y),swap(pos1,pos2);
ans+=query(1,id[top[x]],id[x],id[top[x]],id[x]).sum;
if(RC==pos1)ans--;
pos1=LC;
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y),swap(pos1,pos2);
ans+=query(1,id[x],id[y],id[x],id[y]).sum;
if(LC==pos1)ans--;
if(RC==pos2)ans--;
return ans;
}
void upday(int x,int y,int c){
//x To y Interval modification
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]])swap(x,y);
update(1,id[top[x]],id[x],c);
x=fa[top[x]];
}
if(deep[x]>deep[y])swap(x,y);
update(1,id[x],id[y],c);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1,x,y;i<n;i++){
scanf("%d%d",&x,&y);
mp[x].push_back(y),mp[y].push_back(x);
}
dfs1(1,0,1);
dfs2(1,1);
build(1,1,n);
for(int i=1,x,y,z;i<=m;i++){
char op[10];
scanf("%s%d%d",op,&x,&y);
if(op[0]=='Q')printf("%d\n",getdis(x,y));
else{
scanf("%d",&z);
upday(x,y,z);
}
}
}
边栏推荐
- [daily training] 207 Class Schedule Card
- MySQL简单权限管理
- Buckle 78: subset
- 洛谷P6822 [PA2012]Tax(最短路+边变点)
- Pychart's wonderful setting: copy immediately after canceling the comment and bring #
- Pycharm的奇葩设定:取消注释后立马复制会带上#
- 电子学:第012课——实验 13:烧烤 LED
- 用函数的递归来解决几道有趣的题
- c#中设置lable控件的TextAlign属性控制文字居中的方法
- Mining microbial dark matter -- a new idea
猜你喜欢

How to resize an image in C #

Take you through the normalization flow of GaN

Electronics: Lesson 012 - Experiment 13: barbecue LED

剑指offer刷题(简单等级)

Electronics: Lesson 010 - Experiment 9: time and capacitors

What are the problems with traditional IO? Why is zero copy introduced?

一文了解 | 革兰氏阳性和阴性菌区别,致病差异,针对用药

Basic use of ActiveMQ in Message Oriented Middleware

使用Adobe Acrobat Pro调整PDF页面为统一大小

To understand the difference between Gram-positive and Gram-negative bacteria and the difference in pathogenicity
随机推荐
洛谷P5994 [PA2014]Kuglarz(异或思维+MST)
Machine learning notes linear regression of time series
c# winform panel自定义图片和文字
Electronics: Lesson 012 - Experiment 13: barbecue LED
【日常训练】207. 课程表
Invalid Navicat scheduled task
To understand the difference between Gram-positive and Gram-negative bacteria and the difference in pathogenicity
电子学:第009课——实验 7:研究继电器
【视频】ffplay 使用mjpeg格式播放usb摄像头
Functions should not specify operation types through variables
电子学:第014课——实验 15:防入侵报警器(第一部分)
Importer des données dans MATLAB
Buckle 78: subset
How to use ad wiring for PCB design?
Analysis of kinsing dual platform mining family virus
Pychart's wonderful setting: copy immediately after canceling the comment and bring #
云计算考试版本1.0
1464. maximum product of two elements in an array
Application of can optical transceiver of ring network redundant can/ optical fiber converter in fire alarm system
【补题】2021牛客暑期多校训练营4-n