3397. 【GDOI2014模拟】雨天的尾巴
题目描述
- 深绘里一直很讨厌雨天。
- 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。
- 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一片狼藉。
- 无奈的深绘里和村民们只好等待救济粮来维生。
- 不过救济粮的发放方式很特别。
- 首先村落里的一共有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(nlog2n),所以时间复杂度是可以得到保证的。
- 然后对于一个点,把它所有子树的线段树合并,然后把它差分的值加上去,用线段树维护救济粮最大值即可。
代码
#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模拟】雨天的尾巴相关推荐
- P4556,jzoj3397-[GDOI2014模拟]雨天的尾巴【树链剖分,线段树】
正题 题目链接:https://www.luogu.org/problemnew/show/P4556 题目大意 nnn个点的一棵树,给出mmm个操作(x,y,z)(x,y,z)(x,y,z)表示将x ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- bzoj3307: 雨天的尾巴
3307: 雨天的尾巴 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 479 Solved: 214 [Submit][Status][Discu ...
- bzoj3307 雨天的尾巴
3307: 雨天的尾巴 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 258 Solved: 121 [Submit][Status][Discu ...
- 声音信标—雨模拟雨天防水测试
01 内容介绍 声音信标组,因为声波的反射会对信标的识别造成影响,所以声音信标组最好是放置在室外空旷场所.由于比赛时间为夏天,天气多变,不止有刺眼的阳光,也有狂风和暴雨. 下面是模拟雨天信标灯 ...
- Python与机器视觉(x)下雨啦,图片模拟雨天效果
本系列博客主要分享Python在机器视觉/计算机视觉下的编程应用 cv2包是著名的视觉库OpenCV的Python实现 在opencv中,可以利用随机噪声.滤波器等方法为图像叠加仿真的雨滴的运动轨迹, ...
- P4556 雨天的尾巴
题目背景 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地 ...
- 【JZOJ3397】【luoguP4556】雨天的尾巴
description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...
- [线段树][树上差分] Jzoj P3397 雨天的尾巴
Description 深绘里一直很讨厌雨天. 灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切. 虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连 ...
- 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...
最新文章
- jqgrid如何渲染表格数据_jqgrid,jquery_jqGrid pivot 增加分项小计,jqgrid,jquery,jquery插件,javascript,表格 - phpStudy...
- 为什么现在小学生都学计算机编程了,为何要在小学阶段开展编程教育?
- 集体备课模板_幼儿教师资格证面试试讲万能模板和历年真题,看完轻松过面试!...
- usb转ttl模块与matlab,USB接口转TTL小板的自检测试
- [vue] 说说你对proxy的理解
- 2014年9月计算机二级mysql真题_2017年9月全国计算机二级MySQL考试章节练习题
- java提交表单后页面不刷新_表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交(急!!谢谢!)...
- 36000+开发者,一周投稿超 23000 篇,谁能笑傲群雄?| 第4周周榜揭晓
- denali vip使用经验
- kmem_cache_alloc核心函数slab_alloc_node的实现详解
- aucc2018插件_Voxengo音频插件合集2018最新版
- 计算机前摄像头怎么录视频教程,电脑摄像头录制视频_电脑摄像头录像怎么录...
- BP神经网络算法基本原理,bp神经网络算法详解
- python time和datetime、pytz
- 安徽汽车网程序员删库跑路?安徽汽车官网只剩3张图片!
- 用了一个多月时间治好了自己的胸膜炎
- 前端头像上传功能实现之普通图片/头像上传 详细解析1【扩展知识FormData对象】
- 多维度入手打造稳定高效的自动测试设备,迎接集成电路融合时代的机遇与挑战
- 中国国产浏览器有哪些
- 关于子类中virtual可有可无的讨论
热门文章
- s5p4418的uboot网络无法使用问题解决
- turf.js API功能讲解
- marshmallow文档
- 强弱类型,动态静态语言比较(JAVA,C,C++,Python,Ruby,PHP,Perl)
- 作宾语,不定式与动名词的区别——脑动词和手动词
- vbmsgbox引用变量_vb中msgbox用法
- dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
- 饥荒控制台输入没用_饥荒代码为什么我输入没反应
- 【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
- 制造业的日子为啥难过?因为这几个痛点没有解决