题目描述

  • 深绘里一直很讨厌雨天。
  • 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。
  • 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一片狼藉。
  • 无奈的深绘里和村民们只好等待救济粮来维生。
  • 不过救济粮的发放方式很特别。
  • 首先村落里的一共有n 座房屋,并形成一个树状结构。然后救济粮分m 次发放,每次选择两个房屋(x,y),然后对于x 到y 的路径上(含x 和y) 每座房子里发放一袋z 类型的救济粮。
  • 然后深绘里想知道,当所有的救济粮发放完毕后,每座房子里存放的最多的是哪种救济粮。

数据范围

n,m≤105n,m \le 10^5n,m≤105

题目分析

  • 都说了如今是logloglog的时代!
  • 让我说一下两种做法。

树链剖分

  • 显然。
  • 先差分,对于一个路径x−>yx->yx−>y,在xxx与yyy上+1,LCALCALCA上-1,LCALCALCA父亲上-1。
  • 这样子对于一个点,它救济粮真正个数即为整个子树的和。
  • 然后用树链剖分维护一些救济粮的最大值即可。

线段树合并

  • 又是一个神奇算法。
  • 但要注意线段树合并一般都要与动态开点配套,不然会超时。
  • 所谓线段树合并,不要想得那么高深,其实就是直接合并。一个点一个点合并,只不过要是其中有一个数的这个位置“没有点”,直接连边即可。
  • 具体方法参见百度优先搜索
  • 因为所有点的总和不超过O(nlog2n)O(nlog_2n)O(nlog2​n),所以时间复杂度是可以得到保证的。
  • 然后对于一个点,把它所有子树的线段树合并,然后把它差分的值加上去,用线段树维护救济粮最大值即可。

代码

#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+100,maxn=17,Max=1e9;
struct node{int x,y,next;
}a[2*N];int len,last[N];
struct tree{int lc,rc,c;
}tr[N*70];int len2=0;
void ins(int x,int y){a[++len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;
}
int fa[N][19],deep[N];bool bk[N];
void dfs(int x){bk[x]=false;for(int i=1;i<=maxn;i++) fa[x][i]=fa[fa[x][i-1]][i-1];for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(bk[y]) deep[y]=deep[x]+1,fa[y][0]=x,dfs(y);}
}
int findlca(int x,int y){for(int i=maxn;i>=0;i--){if(deep[fa[x][i]]>=deep[y]) x=fa[x][i];if(deep[fa[y][i]]>=deep[x]) y=fa[y][i];}for(int i=maxn;i>=0;i--){if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];}if(x!=y) x=fa[x][0],y=fa[y][0];return x;
}
int Ans[N],root[N];
int mymax(int x,int y) {return x>y?x:y;}
void change(int &now,int L,int R,int k,int c){if(!now) now=++len2;if(L==R) {tr[now].c+=c;return ;}int mid=(L+R)>>1;int &lc=tr[now].lc,&rc=tr[now].rc;if(k<=mid) change(lc,L,mid,k,c);else change(rc,mid+1,R,k,c);tr[now].c=mymax(tr[lc].c,tr[rc].c);
}
void merge(int &nowx,int &nowy,int L,int R){if(!nowy) return ;if(!nowx) {nowx=nowy;return ;}if(L==R) {tr[nowx].c+=tr[nowy].c;return ;}int mid=(L+R)>>1;merge(tr[nowx].lc,tr[nowy].lc,L,mid);merge(tr[nowx].rc,tr[nowy].rc,mid+1,R);int lc=tr[nowx].lc,rc=tr[nowx].rc;tr[nowx].c=mymax(tr[lc].c,tr[rc].c);
}
int findans(int now,int L,int R){if(L==R) return L;int mid=(L+R)>>1;int lc=tr[now].lc,rc=tr[now].rc;if(!lc) return findans(rc,mid+1,R);if(!rc) return findans(lc,L,mid);if(tr[lc].c>=tr[rc].c) return findans(lc,L,mid);else return findans(rc,mid+1,R);
}
void dfs2(int x){for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(fa[y][0]==x){dfs2(y);merge(root[x],root[y],1,Max);}}if(tr[root[x]].c<=0) Ans[x]=0;else Ans[x]=findans(root[x],1,Max);
}
int main()
{int n,m;scanf("%d%d",&n,&m);len=0;memset(last,0,sizeof(last));for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);ins(x,y);ins(y,x);}deep[1]=1;memset(bk,true,sizeof(bk));dfs(1);for(int i=1;i<=n;i++) root[i]=i,len2++;for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);int lca=findlca(x,y);change(root[x],1,Max,z,1);change(root[y],1,Max,z,1);change(root[lca],1,Max,z,-1);if(fa[lca][0]) change(root[fa[lca][0]],1,Max,z,-1);}dfs2(1);for(int i=1;i<=n;i++) printf("%d\n",Ans[i]);return 0;
}

3397. 【GDOI2014模拟】雨天的尾巴相关推荐

  1. P4556,jzoj3397-[GDOI2014模拟]雨天的尾巴【树链剖分,线段树】

    正题 题目链接:https://www.luogu.org/problemnew/show/P4556 题目大意 nnn个点的一棵树,给出mmm个操作(x,y,z)(x,y,z)(x,y,z)表示将x ...

  2. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  3. bzoj3307: 雨天的尾巴

    3307: 雨天的尾巴 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 479  Solved: 214 [Submit][Status][Discu ...

  4. bzoj3307 雨天的尾巴

    3307: 雨天的尾巴 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 258  Solved: 121 [Submit][Status][Discu ...

  5. 声音信标—雨模拟雨天防水测试

    01 内容介绍   声音信标组,因为声波的反射会对信标的识别造成影响,所以声音信标组最好是放置在室外空旷场所.由于比赛时间为夏天,天气多变,不止有刺眼的阳光,也有狂风和暴雨.   下面是模拟雨天信标灯 ...

  6. Python与机器视觉(x)下雨啦,图片模拟雨天效果

    本系列博客主要分享Python在机器视觉/计算机视觉下的编程应用 cv2包是著名的视觉库OpenCV的Python实现 在opencv中,可以利用随机噪声.滤波器等方法为图像叠加仿真的雨滴的运动轨迹, ...

  7. P4556 雨天的尾巴

    题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...

  8. 【JZOJ3397】【luoguP4556】雨天的尾巴

    description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...

  9. [线段树][树上差分] Jzoj P3397 雨天的尾巴

    Description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...

  10. 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并

    题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...

最新文章

  1. jqgrid如何渲染表格数据_jqgrid,jquery_jqGrid pivot 增加分项小计,jqgrid,jquery,jquery插件,javascript,表格 - phpStudy...
  2. 为什么现在小学生都学计算机编程了,为何要在小学阶段开展编程教育?
  3. 集体备课模板_幼儿教师资格证面试试讲万能模板和历年真题,看完轻松过面试!...
  4. usb转ttl模块与matlab,USB接口转TTL小板的自检测试
  5. [vue] 说说你对proxy的理解
  6. 2014年9月计算机二级mysql真题_2017年9月全国计算机二级MySQL考试章节练习题
  7. java提交表单后页面不刷新_表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交(急!!谢谢!)...
  8. 36000+开发者,一周投稿超 23000 篇,谁能笑傲群雄?| 第4周周榜揭晓
  9. denali vip使用经验
  10. kmem_cache_alloc核心函数slab_alloc_node的实现详解
  11. aucc2018插件_Voxengo音频插件合集2018最新版
  12. 计算机前摄像头怎么录视频教程,电脑摄像头录制视频_电脑摄像头录像怎么录...
  13. BP神经网络算法基本原理,bp神经网络算法详解
  14. python time和datetime、pytz
  15. 安徽汽车网程序员删库跑路?安徽汽车官网只剩3张图片!
  16. 用了一个多月时间治好了自己的胸膜炎
  17. 前端头像上传功能实现之普通图片/头像上传 详细解析1【扩展知识FormData对象】
  18. 多维度入手打造稳定高效的自动测试设备,迎接集成电路融合时代的机遇与挑战
  19. 中国国产浏览器有哪些
  20. 关于子类中virtual可有可无的讨论

热门文章

  1. s5p4418的uboot网络无法使用问题解决
  2. turf.js API功能讲解
  3. marshmallow文档
  4. 强弱类型,动态静态语言比较(JAVA,C,C++,Python,Ruby,PHP,Perl)
  5. 作宾语,不定式与动名词的区别——脑动词和手动词
  6. vbmsgbox引用变量_vb中msgbox用法
  7. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  8. 饥荒控制台输入没用_饥荒代码为什么我输入没反应
  9. 【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
  10. 制造业的日子为啥难过?因为这几个痛点没有解决