正解:线段树合并

解题报告:

传送门!

考虑对树上的每个节点开一棵权值线段树,动态开点,记录一个max(num,id)(这儿的id,define了一下,,,指的是从小到大排QAQ

然后修改操作可以考虑树上差分,大概形式就tr[l]++,tr[r]++,tr[lca]--,tr[lca.fa]--

然后最后求和的时候从底向上合并一边合并一边输出就好

然后这题是有点儿卡空间的(但是我开始学的时候就学的是比较节省空间的那种,,,所以其实并麻油卡住我23333

但是还是总结下线段树合并的几个比较常见的省空间操作

1)空间回收

不难想到在合并两棵树的时候,会有一棵树在合并之后就麻油用了嘛,就很浪费那些点

所以我们可以优先考虑重复利用不再会被用到的节点

所以另外开一个数组,存能被重新利用的节点的编号

具体代码看下面趴并不难理解不说了QAQ

但是这题里好像并没有什么用,,,?因为

  1. inline int nw(){if(tot)return rab[tot--];return ++cnt;}
  2. inline void throw(int x){rab[++top]=x,ls[x]=rs[x]=Max[x]=id[x]=;}

2)然后还有一个技巧,是只针对这题的,其他题目不一定能用

就是考虑到这题里面合并之后就没有再修改之类的操作了

所以可以直接合并到其中一棵树上

但是如果,在合并操作之后还要支持修改,就要新开点了QAQ

3)还有一个是我自己的小习惯

这个应该一般人不会有这个问题,,,就是我喜欢在结构体里存储l和r

这样确实比较方便

但是!

耗空间阿!

这题我开始MLE了就是这个问题QAQ

没了,我目前get了的就这几个QwQ!

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define il inline
  4. #define fr first
  5. #define sc second
  6. #define rg register
  7. #define gc getchar()
  8. #define mp make_pair
  9. #define t(i) edge[i].to
  10. #define rp(i,x,y) for(rg int i=x;i<=y;++i)
  11. #define my(i,x,y) for(rg int i=x;i>=y;--i)
  12. #define e(i,x) for(rg int i=head[x];i;i=edge[i].nxt)
  13.  
  14. const int N=+;
  15. int n,m,rt[N],nod_cnt,head[N],ed_cnt,fa[N][],dep[N],as[N],x[N],y[N],z[N],mx;
  16. struct node{int ls,rs,val,mx;}tr[N*];
  17. struct ed{int to,nxt;}edge[N<<];
  18.  
  19. il int read()
  20. {
  21. rg char ch=gc;rg int x=;rg bool y=;
  22. while(ch!='-' && (ch>'' || ch<''))ch=gc;
  23. if(ch=='-')ch=gc,y=;
  24. while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
  25. return y?x:-x;
  26. }
  27. il void ad(int x,int y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
  28. il void dfs(int x,int fat){fa[x][]=fat;dep[x]=dep[fat]+;rp(i,,)fa[x][i]=fa[fa[x][i-]][i-];e(i,x)if(t(i)^fat)dfs(t(i),x);}
  29. il int lca(int x,int y)
  30. {
  31. if(dep[x]<dep[y])swap(x,y);
  32. my(i,,)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];if(x==y)return x;
  33. my(i,,)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
  34. return fa[x][];
  35. }
  36. il void pushup(int x)
  37. {if(tr[tr[x].ls].val>=tr[tr[x].rs].val)tr[x].mx=tr[tr[x].ls].mx,tr[x].val=tr[tr[x].ls].val;else tr[x].mx=tr[tr[x].rs].mx,tr[x].val=tr[tr[x].rs].val;}
  38. il void modify(int l,int r,int x,int to,int dat)
  39. {
  40. if(l==r){tr[x].val+=dat,tr[x].mx=(tr[x].val>?l:);return;}
  41. int mid=(l+r)>>;
  42. if(to<=mid){if(!tr[x].ls)tr[x].ls=++nod_cnt;modify(l,mid,tr[x].ls,to,dat);}
  43. else{if(!tr[x].rs)tr[x].rs=++nod_cnt;modify(mid+,r,tr[x].rs,to,dat);}
  44. pushup(x);
  45. }
  46. il int merge(int l,int r,int nw1,int nw2)
  47. {
  48. if(!nw1 || !nw2)return tr[nw1+nw2].val=tr[nw1].val+tr[nw2].val,tr[nw1+nw2].mx=tr[nw1].mx+tr[nw2].mx,nw1+nw2;
  49. if(l==r)return tr[nw1].val+=tr[nw2].val,tr[nw1].mx=(tr[nw1].val>?l:),nw1;
  50. int mid=(l+r)>>;tr[nw1].ls=merge(l,mid,tr[nw1].ls,tr[nw2].ls);tr[nw1].rs=merge(mid+,r,tr[nw1].rs,tr[nw2].rs);
  51. pushup(nw1);return nw1;
  52. }
  53. il void dfsdfs(int x,int fat){e(i,x)if(t(i)^fat)dfsdfs(t(i),x),rt[x]=merge(,mx,rt[x],rt[t(i)]);as[x]=tr[rt[x]].mx;}
  54.  
  55. int main()
  56. {
  57. n=read();m=read();rp(i,,n)rt[i]=++nod_cnt;
  58. rp(i,,n-){int x=read(),y=read();ad(x,y);ad(y,x);}dfs(,);
  59. rp(i,,m)x[i]=read(),y[i]=read(),z[i]=read(),mx=max(mx,z[i]);
  60. rp(i,,m){int lcaa=lca(x[i],y[i]);modify(,mx,rt[x[i]],z[i],);modify(,mx,rt[y[i]],z[i],);modify(,mx,rt[lcaa],z[i],-);if(fa[lcaa][])modify(,mx,rt[fa[lcaa][]],z[i],-);}
  61. dfsdfs(,);rp(i,,n)printf("%d\n",as[i]);
  62. return ;
  63. }

然后就放代码辣辣辣!

洛谷P4556 雨天的尾巴 线段树的更多相关文章

  1. 洛谷P4556 雨天的尾巴(线段树合并)

    洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...

  2. [洛谷P4556] 雨天的尾巴

    这道题可以用线段树合并做,网上的题解基本上都是线段树合并的. 但是为什么我就偏偏要用dsu on tree...... 题目传送门 dsu on tree的方法类似[CF1009F] Dominant ...

  3. [洛谷 P4556] 雨天的尾巴

    传送门 Solution 线段树合并的入门题 lca可以在dfs的时候离线求(用并查集) 更新的点有每条链的两个端点,它们的lca和dad[lca] 为了节省空间,lca和dad[lca]的更新可以先 ...

  4. P4556 雨天的尾巴 线段树合并

    使用线段树合并,每个节点维护一棵权值线段树,下标为救济粮种类,区间维护数量最多的救济粮编号(下标).所以每个节点答案即为\(tre[rot[x]]\). 然后运用树上点的差分思想,对于分发路径\(u, ...

  5. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

  6. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  7. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

  8. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  9. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

随机推荐

  1. Go Revel - Testing(测试模块)

    revel提供了一个测试框架来方便的为自己的程序编写功能测试用例. 默认创建的应用骨架附带一个简单的测试用例,这里将它作为起点 ##概览 测试保存在`tests`目录: corp/myapp app/ ...

  2. ruby的第一次使用

    今天看购买的小册,看到推荐使用的工具是ruby写的,提供了源码地址,但是不知道怎么使用 因此尝试使用了下ruby,并记录下来 1.安装 去ruby的官网,下载windows安装包 启动 Ruby 安装 ...

  3. IntelliJ IDEA下spring boot项目打包

    Spring Boot自带Tomcat插件,可以直接编写启动类,开启Tomcat服务 springboot适合前后端分离,打成jar进行部署更合适 application.properties配置端口 ...

  4. [Android Studio] Using Java to call OpenCV

    Environment: Android studio 2.2.3, OpenCV 2.4.9 For Android, Android 6 with api 23 for X86 一.File: b ...

  5. Java -- POI -- 入门使用以及简单介绍

    1.创建工作簿 (WORKBOOK) HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputSt ...

  6. CentOS7 设置软件镜像源

    Linux拥有众多的发行版,每个发行版都有提供镜像,但是,在国内这些镜像的下载速度参差不齐,偶尔会有更新失败的情况. 网上众多推荐的镜像源为163的镜像,笔者通过一段时间的试用,发现某些小众带宽访问1 ...

  7. ehcache缓存配置与参数说明

    <diskStore path="java.io.tmpdir" /> <defaultCache eternal="false" maxEl ...

  8. Ubuntu下SSH无密码验证配置

    前言 SSH为Secure Shell 的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.越来越多的小伙伴们使用远程登录,而ssh安全性无疑是很高的,那么我们现在来看看如何实现ss ...

  9. [原]Jenkins(三)---Jenkins初始配置和插件配置

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...

  10. 也谈.Net中间语言——破解Delphi2CS行数和时间限制

    其实我一直在研究将Delphi版的传奇2源代码使用C#实现,不过由于我并没有学习过Delphi.就只能说先试着用一些工具转换代码. 后来我在网上找到了一款软件:Delphi2CS.这款软件比较强大,虽 ...