当前位置:网站首页>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);
}
}
}
边栏推荐
- Electronics: Lesson 014 - Experiment 15: intrusion alarm (Part I)
- 【红旗杯?】补题
- Est - il sûr d'ouvrir un compte d'actions maintenant via le lien d'ouverture de compte coiffé?
- How to use ad wiring for PCB design?
- 2265. number of nodes with statistical value equal to the average value of subtree
- C#中如何调整图像大小
- Pcb|about FPC reinforcement type
- c#中设置lable控件的TextAlign属性控制文字居中的方法
- Is it safe to open an account through the haircut account opening link now?
- 【论文学习】《VQMIVC》
猜你喜欢
随机推荐
Debugging mipi-dsi screen based on stm32mp157
Can transparent cloud gateway caniot and candtu record can messages and send and receive can data remotely
FFT【模板】
Analysis and utilization of Microsoft Office Word remote command execution vulnerability (cve-2022-30190)
Importer des données dans MATLAB
將數據導入到MATLAB
Three Siemens fire-fighting hosts fc18 are equipped with can optical transceiver for optical fiber redundant ring network networking test
【红旗杯?】补题
Machine learning notes linear regression of time series
The fourth floor is originally the fourth floor. Let's have a look
Import data into Matlab
电子学:第010课——实验 9:时间与电容器
57. insert interval
电子学:第010课——实验 8:继电振荡器
Electronics: Lesson 011 - experiment 10: transistor switches
2021ICPC网络赛第一场
How to create a new branch with SVN
洛谷P6822 [PA2012]Tax(最短路+边变点)
基于STM32MP157调试MIPI-DSI屏幕
基于Anaconda的模块安装与注意事项









