自己搞的算法超时了。。但是思路没什么问题:用线段树维护每个点到叶子节点的距离即可

  1. /*
  2. 线段树维护区间最小值,每次向下访问,就把访问到的点对应的区间段减去边权
  3. 到另一颗子树访问时,向上回溯时加上减去的边权即可;
  4. */
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. #define ll long long
  8. #define maxn 500050
  9. #define INF 0x3f3f3f3f3f3f3f3f
  10. struct Query{
  11. int x,l,r,id;
  12. bool operator<(const Query &y)const{return x<y.x;}
  13. }Q[maxn];
  14. int q,n,fa[maxn],r[maxn],leaf[maxn];
  15. ll dep[maxn],w[maxn],ans[maxn];
  16.  
  17. /*线段树部分*/
  18. #define lson l,m,rt<<1
  19. #define rson m+1,r,rt<<1|1
  20. ll Min[maxn<<],add[maxn<<];
  21. inline void pushup(int rt){Min[rt]=min(Min[rt<<],Min[rt<<|])+add[rt];}
  22.  
  23. void build(int l,int r,int rt){
  24. add[rt]=;
  25. if(l==r){Min[rt]=leaf[l]?dep[l]:INF;return;}//不是叶子节点就是无限大
  26. int m=l+r>>;
  27. build(lson);
  28. build(rson);
  29. pushup(rt);
  30. }
  31. void Add(int L,int R,int l,int r,int rt,int val){
  32. if(L<=l && R>=r){
  33. add[rt]+=val;Min[rt]+=val;return;
  34. }
  35. int m=l+r>>;
  36. if(L<=m) Add(L,R,lson,val);
  37. if(R>m) Add(L,R,rson,val);
  38. pushup(rt);
  39. }
  40. ll query(int L,int R,int l,int r,int rt){
  41. if(L<=l && R>=r)return Min[rt];
  42. int m=l+r>>;
  43. ll res=INF;
  44. if(L<=m)res=min(res,query(L,R,lson));
  45. if(R>m)res=min(res,query(L,R,rson));
  46. return res+add[rt];
  47. }
  48.  
  49. int main(){
  50. cin>>n>>q;
  51. memset(leaf,,sizeof leaf);
  52. for(int i=;i<=n;i++)r[i]=i;
  53. for(int i=;i<=n;i++){
  54. cin>>fa[i]>>w[i];
  55. leaf[fa[i]]=;
  56. dep[i]=dep[fa[i]]+w[i];
  57. }
  58. for(int i=n;i>=;i--)
  59. r[fa[i]]=max(r[fa[i]],r[i]);
  60. for(int i=;i<q;i++)
  61. cin>>Q[i].x>>Q[i].l>>Q[i].r,Q[i].id=i;
  62. sort(Q,Q+q);
  63.  
  64. build(,n,);
  65. int x=,qi=;//从根开始遍历
  66. ll offset=;//用来记录回溯的
  67. while(){
  68. while(Q[qi].x==x && qi<q){
  69. ans[Q[qi].id]=query(Q[qi].l,Q[qi].r,,n,)+offset;
  70. ++qi;
  71. }
  72. if(x<n){
  73. int y=x+;
  74. while(x!=fa[y]){
  75. Add(x,r[x],,n,,*w[x]);
  76. offset-=w[x]; x=fa[x];
  77. }
  78. x=y;
  79. Add(x,r[x],,n,,-*w[x]);
  80. offset+=w[x];
  81. }
  82. else break;
  83. }
  84. for(int i=;i<q;i++)printf("%lld\n",ans[i]);
  85. }

这是cf上的代码

  1. #include<bits/stdc++.h>
  2. #define maxn 1000005
  3. #define F first
  4. #define S second
  5. using namespace std;
  6. typedef long long ll;
  7. const ll INF=1e18;
  8. typedef pair<ll,ll> pi;
  9. typedef pair<int,pi> pii;
  10. vector <pi> h[maxn];
  11. vector <pii> q[maxn];
  12. ll ans[maxn],a[maxn],dep[maxn],st[maxn*],add[maxn*];
  13. int n,m,Q,id,l[maxn],r[maxn];
  14.  
  15. void build(int o,int l,int r){
  16. if (l==r) st[o]=a[l];
  17. else {
  18. int m=l+((r-l)>>);
  19. build(o<<,l,m);
  20. build((o<<)|,m+,r);
  21. st[o]=min(st[o<<],st[(o<<)|]);
  22. }
  23. }
  24.  
  25. void pushup(int o){
  26. st[o]=min(st[o<<],st[o<<|]);
  27. }
  28.  
  29. void pushdown(int o,int l,int r){
  30. if (add[o]){
  31. add[o<<]+=add[o];
  32. add[o<<|]+=add[o];
  33. int m=l+((r-l)>>);
  34. st[o<<]+=add[o];
  35. st[o<<|]+=add[o];
  36. add[o]=;
  37. }
  38. }
  39.  
  40. void update(int o,int l,int r,int ql,int qr,ll addv){
  41. if (ql<=l&&qr>=r) {
  42. add[o]+=addv;
  43. st[o]+=addv;
  44. return;
  45. }
  46. pushdown(o,l,r);
  47. int m=l+((r-l)>>);
  48. if (ql<=m) update(o<<,l,m,ql,qr,addv);
  49. if (qr>=m+) update(o<<|,m+,r,ql,qr,addv);
  50. pushup(o);
  51. }
  52.  
  53. ll query(int o,int l,int r,int ql,int qr){
  54. if(ql<=l&&qr>=r) return st[o];
  55. pushdown(o,l,r);
  56. int m=l+((r-l)>>);
  57. ll ans=INF;
  58. if (ql<=m) ans=min(ans,query(o<<,l,m,ql,qr));
  59. if (qr>=m+) ans=min(ans,query(o<<|,m+,r,ql,qr));
  60. return ans;
  61. }
  62.  
  63. void dfs0(int u){
  64. ++id; assert(u==id);
  65. l[u]=id;
  66. if (!h[u].size()) a[u]=dep[u]; else a[u]=INF;
  67. for (int i=;i<h[u].size();i++){
  68. int v=h[u][i].F;
  69. dep[v]=dep[u]+h[u][i].S;
  70. dfs0(v);
  71. }
  72. r[u]=id;
  73. }
  74.  
  75. void dfs(int u){
  76. for (int i=;i<q[u].size();i++) ans[q[u][i].F]=query(,,n,q[u][i].S.F,q[u][i].S.S)+dep[u];
  77. for (int i=;i<h[u].size();i++){
  78. int v=h[u][i].F;
  79. update(,,n,l[v],r[v],-h[u][i].S*);
  80. dfs(v);
  81. update(,,n,l[v],r[v],h[u][i].S*);
  82. }
  83. }
  84.  
  85. int main(){
  86. cin >> n >> Q;
  87. for (int i=;i<=n;i++){
  88. ll u,v;
  89. scanf("%I64d%I64d",&u,&v);
  90. h[u].push_back((pi){i,v});
  91. }
  92. for (int i=;i<=Q;i++){
  93. int u,v,w;
  94. scanf("%d%d%d",&w,&u,&v);
  95. q[w].push_back((pii){i,(pi){u,v}});
  96. }
  97. dfs0();
  98. build(,,n);
  99. dfs();
  100. for (int i=;i<=Q;i++) printf("%I64d\n",ans[i]);
  101. return ;
  102. }

cf1110F 离线+树上操作+线段树区间更新的更多相关文章

  1. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  2. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  3. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  4. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  5. HDU5039--Hilarity DFS序+线段树区间更新 14年北京网络赛

    题意:n个点的树,每个条边权值为0或者1, q次操作 Q 路径边权抑或和为1的点对数, (u, v)(v, u)算2个. M i修改第i条边的权值 如果是0则变成1, 否则变成0 作法: 我们可以求出 ...

  6. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  7. POJ 3468:A Simple Problem with Integers(线段树区间更新模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 141093 ...

  8. ZOJ 1610 Count the Color(线段树区间更新)

    描述Painting some colored segments on a line, some previously painted segments may be covered by some ...

  9. POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】

    任意门:http://poj.org/problem?id=2528 Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total S ...

随机推荐

  1. Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)

    题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...

  2. cxf方式实现webservice接口笔记

    1.配置cxf的jar包依赖: 因maven中央仓库会自带cxf的相关依赖jar,故去maven官网搜索并获取pom配置到本地pom.xml文件即可,maven中央仓库搜索引擎地址:http://se ...

  3. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

  4. 【转载】论文笔记系列-Tree-CNN: A Deep Convolutional Neural Network for Lifelong Learning

    一. 引出主题¶ 深度学习领域一直存在一个比较严重的问题——“灾难性遗忘”,即一旦使用新的数据集去训练已有的模型,该模型将会失去对原数据集识别的能力.为解决这一问题,本文提出了树卷积神经网络,通过先将 ...

  5. 20165221—JAVA第六周学习心得

    课本知识点小结 第8章:常用实用类 String类 常量对象放入常量池中,而用string声明的对象变量中存放着引用.凡是new构造的常量都不在常量池中. startIndex表示提取字符的起始位置, ...

  6. SQLServer常用分页方式

    mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试. 0.原来的SQL的所有数据 下面 ...

  7. Linux iptables防火墙

    查找安装包yum list | grep iptables 安装iptables yum install iptables-services 重启防火墙使配置文件生效 systemctl restar ...

  8. LwIP Application Developers Manual5---高层协议之DNS

    1.前言 lwIP提供一个基本的DNS客户端(1.3.0后引进),通过使用DNS(Domain Name System)协议来允许应用程序解决主机名到地址的转换. 在文件lwipopts.h里面定义L ...

  9. requests库入门13-会话对象

    会话对象可以在跨请求保持某些参数,会话对象有requests api的大部分方法,我理解会话对象就是一个资源共享池 使用requests.Session()可以创建会话对象的实例 还是以之前GitHu ...

  10. ubuntu 远程登录错误

    利用  ubuntu 16.04 自带功能远程登录到同事的电脑时,提示如下错误: This file server type is not recognized 百度一下,得知,缺少必要的文件,安装后 ...