题意

一棵树

多次修改,每次修改一个点到根的所有边的颜色,并询问现在有哪些颜色染了恰好$m$条边

题解:

稍加思考可以知道,从某个点到根节点的颜色数,均摊复杂度很低,因此,可以考虑珂朵莉树维护重链剖分

这里也记录一下珂朵莉树的代码

代码:

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(int ii=b;ii>=a;--ii)
#define forn(ii,x) for(int ii=head[x];ii;ii=edge[ii].next)
using namespace std;
const int maxn=2e5+20,maxm=2e6+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
int casn,n,m,k,col[maxn],ans[maxn];
class odtree{public:
struct segnode{int l,r,c;bool operator <(const segnode &a)const{return r<a.r;}};
set<segnode> nodes;
void split(int pos){auto it=nodes.lower_bound({pos,pos});
if(it==nodes.end()||(it->l)>pos||(it->r)==pos) return ;
int l=it->l,r=it->r,c=it->c;
nodes.erase(it);nodes.insert({l,pos,c});nodes.insert({pos+1,r,c});
}
void update(int l,int r,int c){
split(l-1);split(r);
while(1){auto it=nodes.lower_bound({l,l});
if(it==nodes.end()||(it->l)>r) break;
if(it->c){--ans[col[it->c]];col[it->c]-=(it->r)-(it->l)+1;++ans[col[it->c]];}
nodes.erase(it);
}
--ans[col[c]];col[c]+=r-l+1;++ans[col[c]];
nodes.insert({l,r,c});
}
}tree;
namespace chain{
struct data_e{int to,next;}edge[maxn<<1];
int head[maxn],nume,mp[maxn];
int ltop[maxn],fa[maxn],deep[maxn];
int sz[maxn],remp[maxn],son[maxn],cnt;
inline void addedge(int a,int b){edge[++nume]={b,head[a]};head[a]=nume;}
void init(){rep(i,1,n) head[i]=0;cnt=nume=0;}
void dfs1(int now,int pre,int d){
deep[now]=d,fa[now]=pre,sz[now]=1,son[now]=0;
forn(i,now){int to=edge[i].to;
if(to!=pre) {
dfs1(to,now,d+1);sz[now]+=sz[to];
if(sz[to]>sz[son[now]]) son[now]=to;
}
}
}
void dfs2(int now,int pre,int sp){
ltop[now]=sp;mp[now]=++cnt;remp[cnt]=now;
if(son[now]) dfs2(son[now],now,sp);
forn(i,now){int to=edge[i].to;
if(to!=son[now]&&to!=pre) dfs2(to,now,to);
}
}
void gao(int st=1){dfs1(st,0,0);dfs2(st,0,st);}
void update(int now,int c){
while(now>1){
int l=max(mp[ltop[now]],2),r=mp[now];
if(l<=r) tree.update(l,r,c);
now=fa[ltop[now]];
}
}
};
int main() {IO;
cin>>n>>m>>k;
rep(i,1,n-1){int a,b;
cin>>a>>b;
chain::addedge(a,b);chain::addedge(b,a);
}
ans[0]=m;
chain::gao();
tree.nodes.insert({2,n,0});
while(k--){int a,b,c;
cin>>a>>b>>c;
chain::update(a,b);
cout<<ans[c]<<endl;
}
return 0;
}

gym 102059A 树链剖分后odt维护区间的更多相关文章

  1. HDU 3966 树链剖分后线段树维护

    题意: 一棵树, 操作1.$path(a,b)$之间的点权$+k$ 操作2.单点查询 题解: 树链剖分即可,注意代码细节,双向映射 主要是记录一下板子 #include <string.h> ...

  2. 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问

    链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...

  3. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  4. HDU5840 (分块+树链剖分)

    Problem This world need more Zhu 题目大意 给一颗n个点的有点权的树,有m个询问,对于每个询问u,v,k,首先将点u到点v的最短路径上的所有点按顺序编号,u的编号为1, ...

  5. HDU5221 Occupation 树链剖分

    题意: 给出一棵树,root=1,树有点权,有一个人叫做M 有3种操作: 1 u v 把u到v路径上的所有点的点权都给M 2 u 若u的点权在M手上,拿走 3 u 把u为根的子树的所有点权都给M 每一 ...

  6. BZOJ4712洪水——动态DP+树链剖分+线段树

    题目描述 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬山堵水.那么 ...

  7. Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)

    Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...

  8. BZOJ4732. [清华集训2016]数据交互(树链剖分+线段树+multiset)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4732 题解 首先,一个比较显然的结论是:对于一棵有根树上的两条链 \((x_1, y_1 ...

  9. BZOJ 2243:染色(树链剖分+区间合并线段树)

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

随机推荐

  1. CodeBlocks卸载后重装 编译c文件提示错误信息“No such file or directory”

    编译最简单的helloworld程序,提示第一行#include<stdio.h> 找不到头文件. 解决方法: 再次卸载CodeBlocks后,将之前的配置文件删除. 路径:C:\User ...

  2. EXT 设置编辑框为只读

    Ext.getCmp("processResult").setReadOnly(ture);   //processResult是属性的id,setReadOnly(ture)设置 ...

  3. window.open() & iframe & tab

    window.open() & iframe & tab window.open() open pages in the same window / tab https://stack ...

  4. Vue.js 2.x笔记:组件(5)

    1. 组件简介 组件(Component)是 Vue.js 最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码. 组件:为了拆分Vue实例的代码量,以不同的组件来划分不同的功能模块,需要 ...

  5. 龙光集团地产跃居“中国房地产500强TOP28”

    3月20日,由中国房地产业协会.上海易居房地产研究院中国房地产测评中心联合主办的2019中国房地产500强测评成果发布会在北京成功举办.本次测评成果显示,龙光集团地产凭借综合实力,不仅成功跻身“中国房 ...

  6. CSS绝对定位元素居中的几种方法

    转载自-CSS居中绝对https://www.cnblogs.com/skura23/p/6530556.html 作者:PajamaCat 1,div宽度未知1 <body> <d ...

  7. [搬运] 将 Visual Studio 的代码片段导出到 VS Code

    原文 : A Visual Studio to Visual Studio Code Snippet Converter 作者 : Rick Strahl 译者 : 张蘅水 导语 和原文作者一样,水弟 ...

  8. cmd 常用命令

    注:绿色的为比较常用的命令 命令 名称 ASSOC  显示或修改文件扩展名关联. ATTRIB 显示或更改文件属性. BREAK  设置或清除扩展式 CTRL+C 检查. CACLS 显示或修改文件的 ...

  9. Java 中数字和字符串拼接的问题

    注意细节 字符是char 类型,字符串是String 类型1.数字拼接char,得到的还是数字,相当于和它的ASCII编码相加(如果定义成String 会编译错误)2.数字拼接String,得到的是S ...

  10. hihoCoder #1954 : 压缩树(虚树)

    题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 ...