题解

点分治,然后每个点上挂着一个距离不超过\(a_{i}\)的颜色改成\(c\)

用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define pb push_back
  7. #define space putchar(' ')
  8. #define enter putchar('\n')
  9. #define eps 1e-10
  10. #define MAXN 200005
  11. //#define ivorysi
  12. using namespace std;
  13. typedef long long int64;
  14. typedef unsigned int u32;
  15. typedef double db;
  16. template<class T>
  17. void read(T &res) {
  18. res = 0;T f = 1;char c = getchar();
  19. while(c < '0' || c > '9') {
  20. if(c == '-') f = -1;
  21. c = getchar();
  22. }
  23. while(c >= '0' && c <= '9') {
  24. res = res * 10 +c - '0';
  25. c = getchar();
  26. }
  27. res *= f;
  28. }
  29. template<class T>
  30. void out(T x) {
  31. if(x < 0) {x = -x;putchar('-');}
  32. if(x >= 10) {
  33. out(x / 10);
  34. }
  35. putchar('0' + x % 10);
  36. }
  37. struct ch {
  38. int id,d,c;
  39. };
  40. struct node {
  41. int to,next,val;
  42. }E[MAXN * 2];
  43. int N,head[MAXN],sumE,d[MAXN],M;
  44. bool vis[MAXN];
  45. vector<int> aux[MAXN],dep[MAXN],poi;
  46. vector<ch> sta[MAXN];
  47. void add(int u,int v,int c) {
  48. E[++sumE].to = v;
  49. E[sumE].next = head[u];
  50. E[sumE].val = c;
  51. head[u] = sumE;
  52. }
  53. int Calc_G(int st) {
  54. static int fa[MAXN],son[MAXN],siz[MAXN],que[MAXN],ql,qr;
  55. ql = 1,qr = 0;
  56. que[++qr] = st;son[st] = 0;siz[st] = 1;fa[st] = 0;
  57. while(ql <= qr) {
  58. int u = que[ql++];
  59. for(int i = head[u] ; i ; i = E[i].next) {
  60. int v = E[i].to;
  61. if(!vis[v] && v != fa[u]) {
  62. que[++qr] = v;
  63. siz[v] = 1;son[v] = 0;fa[v] = u;
  64. }
  65. }
  66. }
  67. int res = que[qr];
  68. for(int i = qr ; i >= 1 ; --i) {
  69. int u = que[i];
  70. if(fa[u]) {
  71. siz[fa[u]] += siz[u];
  72. son[fa[u]] = max(son[fa[u]],siz[u]);
  73. }
  74. son[u] = max(son[u],qr - siz[u]);
  75. if(son[u] < son[res]) res = u;
  76. }
  77. return res;
  78. }
  79. void dfs_for_dep(int u,int fa) {
  80. poi.pb(u);
  81. for(int i = head[u] ; i ; i = E[i].next) {
  82. int v = E[i].to;
  83. if(!vis[v] && v != fa) {
  84. d[v] = d[u] + E[i].val;
  85. dfs_for_dep(v,u);
  86. }
  87. }
  88. }
  89. void dfs_divide(int u) {
  90. int G = Calc_G(u);
  91. vis[G] = 1;
  92. sta[G].pb((ch){0,1000000000,0});
  93. d[G] = 0;poi.clear();
  94. dfs_for_dep(G,0);
  95. for(int i = 0 ; i < poi.size() ; ++i) {
  96. aux[poi[i]].pb(G);
  97. dep[poi[i]].pb(d[poi[i]]);
  98. }
  99. for(int i = head[G] ; i ; i = E[i].next) {
  100. int v = E[i].to;
  101. if(!vis[v]) dfs_divide(v);
  102. }
  103. }
  104. void Init() {
  105. read(N);
  106. int u,v,c;
  107. for(int i = 1 ; i < N ; ++i) {
  108. read(u);read(v);read(c);
  109. add(u,v,c);add(v,u,c);
  110. }
  111. dfs_divide(1);
  112. }
  113. void Change(int id,int x,int d,int c) {
  114. for(int i = aux[x].size() - 1 ; i >= 0 ; --i) {
  115. int u = aux[x][i],t = d - dep[x][i];
  116. if(t < 0) continue;
  117. while(sta[u].size()) {
  118. ch l = sta[u].back();
  119. if(l.d <= t) sta[u].pop_back();
  120. else break;
  121. }
  122. sta[u].pb((ch){id,t,c});
  123. }
  124. }
  125. int Query(int x) {
  126. int id = 0,c = 0;
  127. for(int i = aux[x].size() - 1 ; i >= 0 ; --i) {
  128. int u = aux[x][i],d = dep[x][i];
  129. int L = 0,R = sta[u].size() - 1;
  130. while(L < R) {
  131. int mid = (L + R + 1) >> 1;
  132. if(sta[u][mid].d >= d) L = mid;
  133. else R = mid - 1;
  134. }
  135. if(sta[u][L].id > id) {id = sta[u][L].id;c = sta[u][L].c;}
  136. }
  137. return c;
  138. }
  139. void Solve() {
  140. read(M);
  141. int op,v,d,c;
  142. for(int i = 1 ; i <= M ; ++i) {
  143. read(op);read(v);
  144. if(op == 1) {
  145. read(d);read(c);
  146. Change(i,v,d,c);
  147. }
  148. else {
  149. out(Query(v));enter;
  150. }
  151. }
  152. }
  153. int main() {
  154. #ifdef ivorysi
  155. freopen("f1.in","r",stdin);
  156. #endif
  157. Init();
  158. Solve();
  159. }

【Codeforces】Gym100633 D. LWDB的更多相关文章

  1. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  2. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  3. 【CodeForces】601 D. Acyclic Organic Compounds

    [题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...

  4. 【Codeforces】849D. Rooter's Song

    [算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...

  5. 【CodeForces】983 E. NN country 树上倍增+二维数点

    [题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...

  6. 【CodeForces】925 C.Big Secret 异或

    [题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...

  7. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  8. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

  9. 【CodeForces】741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)

    [题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这 ...

随机推荐

  1. live555运行时报错:StreamParser internal error ( 86451 + 64000 > 150000)

    搭建好live555服务器后,使用 vlc播放网络视频.此时服务器端报如下错误: StreamParser internal error ( 86451 + 64000   > 150000). ...

  2. hadoop生态系统主要架构图汇总

    1 hadoop1.0时期架构 2 hadoop2.0时期架构 3 hdfs架构 [Active Namenode]:主 Master(只有一个),管理 HDFS 的名称空间,管理数据块映射信息:配置 ...

  3. Expm 10_2 实现Ford-Fulkerson算法,求出给定图中从源点s到汇点t的最大流,并输出最小割。

    package org.xiu68.exp.exp10; import java.util.ArrayDeque; import java.util.ArrayList; import java.ut ...

  4. Druid监控页面配置与使用

    一.Maven中添加Durid连接池依赖 <!-- druid连接池 --> <dependency> <groupId>com.alibaba</group ...

  5. python创建udp服务端和客户端

    1.udp服务端server from socket import * from time import ctime HOST = '' PORT = 8888 BUFSIZ = 1024 ADDR ...

  6. dict-test

    #! -*- coding:utf-8 -*-"""键必须是唯一的,但值则不必len(dict) 计算字典元素个数,即键的总数str(dict) 输出字典,以可打印的字符 ...

  7. Modbus库开发笔记之一:实现功能的基本设计

    Modbus作为开放式的工业通讯协议,在各种工业设备中应用极其广泛.本人也使用Modbus通讯很多年了,或者用现成的,或者针对具体应用开发,一直以来都想要开发一个比较通用的协议栈能在后续的项目中复用, ...

  8. 什么是orm思想?

    什么是orm思想? 1.hibernate使用orm思想对数据库进行crud操作 2.在web阶段学习javabean更正确的叫法是:实体类 3.orm: object   relational   ...

  9. Java 的 Api 文档生成工具 JApiDocs 程序文档工具

    JApiDocs 详细介绍 简介 JApiDocs 是一个符合 Java 编程习惯的 Api 文档生成工具.最大程度地利用 Java 的语法特性,你只管用心设计好接口,添加必要的注释,JApiDocs ...

  10. Confluence 6 附件存储提取文本文件

    当基于文本的文件上传到 Confluence(例如,Word,PowerPoint 等),这些文件中的文本是可以提取并且添加到索引中的,用户可以通过索引来搜索这些文件中的文本内容,不仅仅是搜索文件名. ...