gym 102059A 树链剖分后odt维护区间
题意
一棵树
多次修改,每次修改一个点到根的所有边的颜色,并询问现在有哪些颜色染了恰好$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维护区间的更多相关文章
- HDU 3966 树链剖分后线段树维护
题意: 一棵树, 操作1.$path(a,b)$之间的点权$+k$ 操作2.单点查询 题解: 树链剖分即可,注意代码细节,双向映射 主要是记录一下板子 #include <string.h> ...
- 2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问
链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- HDU5840 (分块+树链剖分)
Problem This world need more Zhu 题目大意 给一颗n个点的有点权的树,有m个询问,对于每个询问u,v,k,首先将点u到点v的最短路径上的所有点按顺序编号,u的编号为1, ...
- HDU5221 Occupation 树链剖分
题意: 给出一棵树,root=1,树有点权,有一个人叫做M 有3种操作: 1 u v 把u到v路径上的所有点的点权都给M 2 u 若u的点权在M手上,拿走 3 u 把u为根的子树的所有点权都给M 每一 ...
- BZOJ4712洪水——动态DP+树链剖分+线段树
题目描述 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬山堵水.那么 ...
- Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)
Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...
- BZOJ4732. [清华集训2016]数据交互(树链剖分+线段树+multiset)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4732 题解 首先,一个比较显然的结论是:对于一棵有根树上的两条链 \((x_1, y_1 ...
- BZOJ 2243:染色(树链剖分+区间合并线段树)
[SDOI2011]染色Description给定一棵有n个节点的无根树和m个操作,操作有2类:1.将节点a到节点b路径上所有点都染成颜色c:2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认 ...
随机推荐
- ThinkPad T400 键帽下面的X支架的安装方法
有一台古老的T400,清理键盘的时候,X支架老化断了,淘宝买了几个支架,研究一下安装方法: 1.注意支架方向:上面是横向的细支架,下面是两个小孔2.用小螺丝刀把下面的两个小孔推进键盘下面的两个金属钩里 ...
- (light oj 1024) Eid (最小公倍数)
题目链接: http://lightoj.com/volume_showproblem.php?problem=1024 In a strange planet there are n races. ...
- java中的线程池原理
写的不错,https://www.cnblogs.com/dongguacai/p/6030187.html
- (五)jdk8学习心得之默认方法
五.默认方法 1. 使用方法:写在接口中,就是为了接口可以做一些事情. 2. 目的:有很多实现类,有一个公共的抽象方法,其实这些实现类实现该抽象方法的内容是完全一致的,完全没有必要都重新实现一遍.并且 ...
- Maven版本不一致的时候,使用指定版本进行编译
最近用Maven打包项目(本地jdk11)后放到服务器(jdk8)后,报[java.lang.UnsupportedClassVersionError]版本不一致错误. 网上资料说是修改Intelli ...
- python_正则表达式随笔
webpage_regex = re.search(r'span_ed7[\s\S]*', dd) [\s\S]* 匹配多行,转义字符 webpage_regex = re.compile('< ...
- springdata 一对多配置
- Quartus16.1布线优化选择,重编译可能会满足时序
流程 (1)在默认的优化编译下,时序违例. (2)在assignments中选择setting. (3)根据需求,选择不同的优化方式,目前选择性能优先. (4)可以发现时序满足要求. 以上.
- Day058--django--app
1. 完整的登录示例 form表单使用的注意事项: 1. action="" method="post" action 提交的地址 met ...
- 第八周java学习总结
学号 20175206 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章:泛型与集合框架 主要内容 泛型 链表 堆栈 散列映射 树集 树映射 重点和难点 重点:泛型和集合的使 ...