Gym102059A Coloring Roads


题意:\(n\)点的树,一开始每条边都没有颜色,有\(Q\)个操作,每次将从\(u\)到\(1\)路径上的所有边全部染色为颜色\(c\),之后询问整棵树上,出现了\(m\)次的颜色有多少种。数据范围均是\(200000\)。

做法:询问的东西十分奇怪没有办法下手,于是注意到每次的修改都是染色,而且染色的路径也很特殊。于是我们猜测在这种操作方式下,一条路径上连续相同的颜色段数有一个比较优秀的期望值。先考虑如何在一个序列上,进行赋值操作,我们想到了\(ODT\),在修改的同时维护每种颜色出现的次数和每种次数对应的颜色的种类数。对于每次询问的路径,通过树剖把问题转化到为序列上处理。。。

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i = a; i <= b; ++i)
#define pb push_back
typedef long long ll;
const int N = 1 << 18 | 5;
template<class T> inline void read(T &x) {x = 0; char c = getchar(); T f = 1;while(!isdigit(c)) {if(c == '-') f = -1; c = getchar();}while(isdigit(c)) {x = x * 10 + c - '0'; c = getchar();}x *= f;
}
using namespace std;
int n, C, Q;
vector<int> G[N];
int id[N], dfn, top[N], fa[N], sz[N], son[N];
void dfs1(int u, int pre) {sz[u] = 1; fa[u] = pre;int weight = 0;for(int v: G[u]) if(v != pre) {dfs1(v, u);sz[u] += sz[v];if(weight < sz[v]) weight = sz[v], son[u] = v;}
}
void dfs2(int u, int tp) {top[u] = tp; id[u] = ++dfn;if(son[u]) dfs2(son[u],tp);for(int v: G[u]) if(v != fa[u] && v != son[u]) {dfs2(v,v);}
}
int ans[N], col[N];
struct Seg{int l, r, c;bool operator < (const Seg &a) const {return r < a.r;}
};
set< Seg > S;
void split(int p) {auto s = S.lower_bound({p,p});if(s == S.end() || (s->l) > p || p == s->r) return;int L = s->l, R = s->r, C = s->c;S.erase(s); S.insert({L,p,C}); S.insert({p+1,R,C});
}
void update(int L, int R, int C) {split(L-1); split(R);while(1) {auto s = S.lower_bound({L,L});if(s == S.end() || (s->l) > R) break;if(s->c) {-- ans[col[s->c]];col[s->c] -= s->r - s->l + 1;++ ans[col[s->c]];}S.erase(s);}-- ans[col[C]];col[C] += R-L+1;++ ans[col[C]];S.insert({L,R,C});
}
void solve(int u, int c) {while(u > 1) {int L = max(id[top[u]],2), R = id[u];if(L <= R) update(L,R,c);u = fa[top[u]];}
}
int main() {read(n), read(C), read(Q);rep(i,2,n) { int u, v;read(u), read(v);G[u].pb(v), G[v].pb(u);}dfs1(1,0); dfs2(1,1);ans[0] = C;S.insert({2,n,0});while(Q--) { int u, c, m;read(u), read(c), read(m);solve(u,c);printf("%d\n",ans[m]);}
}

转载于:https://www.cnblogs.com/RRRR-wys/p/10487085.html

Gym102059A Coloring Roads相关推荐

  1. USACO07DEC道路建设Building Roads(prim算法+堆优化与Kruskal+路径压缩对比)

    目录 primprimprim算法 KruskalKruskalKruskal算法 P2872 [USACO07DEC]道路建设Building Roads 4 1 1 1 3 1 2 3 4 3 1 ...

  2. R语言使用ggExtra包的ggMarginal函数在散点图的顶部和右侧添加边缘直方图、自定义边缘直方图不同分组的填充色(Coloring Marginal Histograms)

    R语言使用ggExtra包的ggMarginal函数在散点图的顶部和右侧添加边缘直方图.自定义边缘直方图不同分组的填充色(Coloring Marginal Histograms with ggExt ...

  3. Codeforces Round #323 (Div. 2) A. Asphalting Roads

    A. Asphalting Roads time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. hdoj 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列+二分)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1025 View Code 1 #include <iostream> 2 #include&l ...

  5. 洛谷——P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  6. HDU-1025 Constructing Roads In JGShining's Kingdom

    题目大意:就是说怎样建道路才使得所建道路最多.任意两天道路不能交叉. 解题思路:因为是按城市按顺序排列.所以我们只需将两个城市序号用结构体存下来.对富人城市排序. 这样就成了一个序列了,这样就成了一个 ...

  7. CodeForces #369 div2 D Directed Roads DFS

    题目链接:D Directed Roads 题意:给出n个点和n条边,n条边一定都是从1~n点出发的有向边.这个图被认为是有环的,现在问你有多少个边的set,满足对这个set里的所有边恰好反转一次(方 ...

  8. hdu1025 Constructing Roads In JGShining#39;s Kingdom(二分+dp)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 Problem ...

  9. 题目1154:Jungle Roads

    题目描述: The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money ...

最新文章

  1. virtualbox 启动时Kernel driver not installed (rc=-1908) 错误的解决方法
  2. 知乎:中国工商银行南宁分行丢失2.5亿,工作人员个人行为,与银行无关
  3. 考研 考研爬虫大数据分析专业热度
  4. linux centos7挂载/dev/sdb硬盘到根目录(根目录扩容新磁盘)
  5. springboot教程-web(二)
  6. 大表ddl工具online-schema-change使用
  7. java类spring加载_spring的加载机制?
  8. 去了家新公司,技术总监不让用 IntelliJ IDEA!!想离职了。。
  9. 如何安装新的PHP扩展模块
  10. [Web Chart系列之五] 1. 实战draw2d 之总体介绍
  11. 如果你现在很穷,很苦,不要苦恼
  12. 代理模式 vs 装饰模式
  13. Ubuntu16.04安装java(Oracle jre)
  14. notepad++自动补全括号
  15. Mantis1.2.19 在Windows 平台上的安装配置详解
  16. MDCC 2014移动开发人员大会參会实录
  17. 关于身份证加密展示处理以及update table set cou=(select from ..)
  18. 一只小蜜蜂(C ++ 详解 )
  19. Tiled的qbs方式编译记录
  20. 2022年江西最新建筑八大员(质量员)模拟考试题库及答案解析

热门文章

  1. mysql修改主键生成策略信息_常用Hibernate 主键生成策略
  2. 大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!
  3. java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发
  4. oracle sql execute elapsed time,SQL ordered by Elapsed Time 脚本
  5. c语言开发环境 推荐,C语言复习和VC++6.0开发环境推荐.ppt
  6. matlab 传感器的迟滞,MATLAB PI迟滞模型问题
  7. PTA 三足鼎立 (lower_bound()+upper_bound())
  8. ping命令整个过程详解
  9. 快速傅里叶变换(完整推导过程 + 模板)
  10. 多项式求逆模板(NTT + mod)