雨天的尾巴

news/2024/9/28 7:25:07

[Vani有约会] 雨天的尾巴 /【模板】线段树合并

题目背景

深绘里一直很讨厌雨天。

灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。

虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以及田地里的粮食被弄得一片狼藉。

无奈的深绘里和村民们只好等待救济粮来维生。

不过救济粮的发放方式很特别。

题目描述

首先村落里的一共有 \(n\) 座房屋,并形成一个树状结构。然后救济粮分 \(m\) 次发放,每次选择两个房屋 \((x, y)\),然后对于 \(x\)\(y\) 的路径上(含 \(x\)\(y\))每座房子里发放一袋 \(z\) 类型的救济粮。

然后深绘里想知道,当所有的救济粮发放完毕后,每座房子里存放的最多的是哪种救济粮。

输入格式

输入的第一行是两个用空格隔开的正整数,分别代表房屋的个数 \(n\) 和救济粮发放的次数 \(m\)

\(2\) 到 第 \(n\) 行,每行有两个用空格隔开的整数 \(a, b\),代表存在一条连接房屋 \(a\)\(b\) 的边。

\((n + 1)\) 到第 \((n + m)\) 行,每行有三个用空格隔开的整数 \(x, y, z\),代表一次救济粮的发放是从 \(x\)\(y\) 路径上的每栋房子发放了一袋 \(z\) 类型的救济粮。

输出格式

输出 \(n\) 行,每行一个整数,第 \(i\) 行的整数代表 \(i\) 号房屋存放最多的救济粮的种类,如果有多种救济粮都是存放最多的,输出种类编号最小的一种。

如果某座房屋没有救济粮,则输出 \(0\)

样例 #1

样例输入 #1

5 3
1 2
3 1
3 4
5 3
2 3 3
1 5 2
3 3 3

样例输出 #1

2
3
3
0
2

提示

  • 对于 \(20\%\) 的数据,保证 \(n, m \leq 100\)
  • 对于 \(50\%\) 的数据,保证 \(n, m \leq 2 \times 10^3\)
  • 对于 \(100\%\) 测试数据,保证 \(1 \leq n, m \leq 10^5\)\(1 \leq a,b,x,y \leq n\)\(1 \leq z \leq 10^5\)

首先连边连成一个树,显然我们需要一个桶,记录pos位置下的值以及其次数,然后我们需要用树上差分以及LCA,
image
所以可用LCA找到x,y的最近公共祖先以及最近公共祖先的父亲,进行操作,合并过程用线段树合并O(nlogn)的复杂度显然是最优的,关于权值线段树的右边界,注意审题,只需1e5即可

点击查看代码
#include <bits/stdc++.h>
#define lid st[rt].l
#define rid st[rt].r
using namespace std;
int n,m,segtot;
const int N = 1e5+5,MAX=1e5;
vector <int> edge[N];
int root[N],d[N],f[N][33],ans[N];struct tree
{int l,r,cnt,ans,t;
}st[N*80];
int read(){int s=0,f=1;char ch=getchar();for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-')f=-1;for(;ch>='0'&&ch<='9';ch=getchar()) s=s*10+(ch^48);return s*f;
}
void pushup(int rt)
{if(lid==0){st[rt].cnt=st[rid].cnt;st[rt].t=st[rid].t;	return;}if(rid==0){st[rt].cnt=st[lid].cnt;st[rt].t=st[lid].t;return;		}if(st[lid].cnt>=st[rid].cnt){st[rt].cnt=st[lid].cnt;st[rt].t=st[lid].t;}else{st[rt].cnt=st[rid].cnt;st[rt].t=st[rid].t;		}
}
void dfslca(int x,int fa)
{d[x]=d[fa]+1;f[x][0]=fa;for(int j=1;j<=30;j++){f[x][j]=f[f[x][j-1]][j-1];}
//	cout<<"&&"<<x<<" "<<d[x]<<endl;for(int i=0;i<edge[x].size();i++){int to=edge[x][i];if(to==fa)continue;dfslca(to,x);}
}
void LCA_init()
{
//	for(int j=1;j<=25;j++)
//	{
//		for(int i=1;i<=n;i++)
//		{
//			f[i][j]=f[f[i][j-1]][j-1];
//		}
//	}
}
int lca(int x,int y)
{if(d[x]<d[y])swap(x,y);for(int i=30;i>=0;i--){if(d[f[x][i]]>=d[y])x=f[x][i];}if(x==y)return x;for(int i=30;i>=0;i--){if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}
int segtree(int ra,int rb,int l,int r)
{if(!ra)return rb;if(!rb)return ra;if(l==r){st[ra].cnt+=st[rb].cnt;return ra;}int mid=(l+r)>>1;st[ra].l=segtree(st[ra].l,st[rb].l,l,mid);st[ra].r=segtree(st[ra].r,st[rb].r,mid+1,r);pushup(ra);	return ra;
}
void update(int &rt,int l,int r,int pos,int val)
{if(!rt)rt=++segtot;if(l==r){st[rt].cnt+=val;st[rt].t=pos;return;}int mid=(l+r)>>1;if(pos<=mid)update(lid,l,mid,pos,val);else update(rid,mid+1,r,pos,val);pushup(rt);
}
//int query(int rt,int l,int r,int L,int R)
//{
//	if(!rt)return 0;
//	
//}
void dfs(int x,int fa)
{for(int i=0;i<edge[x].size();i++){int to=edge[x][i];if(to==fa)continue;dfs(to,x);root[x]=segtree(root[x],root[to],1,MAX);}ans[x]=st[root[x]].t;if(st[root[x]].cnt==0)ans[x]=0;
}
int main()
{
//	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//	freopen("a.out","r",stdin);cin>>n>>m;int a,b;for(int i=1;i<=n-1;i++){a=read();b=read();
//		cin>>a>>b;edge[a].push_back(b);edge[b].push_back(a);}dfslca(1,0);
//	LCA_init();int x,y,z;for(int i=1;i<=m;i++){x=read();y=read();z=read();
//		cin>>x>>y>>z;int q=lca(x,y);
//		cout<<"###"<<q<<endl;update(root[x],1,MAX,z,1);update(root[y],1,MAX,z,1);update(root[q],1,MAX,z,-1);if(f[q][0])update(root[f[q][0]],1,MAX,z,-1);}dfs(1,0);for(int i=1;i<=n;i++){cout<<ans[i]<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。 如果你是小白也没问题,跟着教程走也是可以搭…

产业园区越来越卷

在经济不断发展和转型升级的大背景下,产业园区作为推动区域经济发展的重要引擎之一,扮演着越来越重要的角色,亦得到了政府、产业巨头、“轻资产”运营商、创投机构等各方力量的持续关注!纵观2023年,产业园区现状如何,在招商、运营、数智化建设等方面,又该如何拨云见日,…

Spring MVC执行流程

视图执行流程用户发送出请求到前端控制器DispatcherServlet。 DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。 HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。 DispatcherServlet调用HandlerAdapter(…

新电脑—机械革命15pro

我觉得15寸的屏幕显示大小刚刚好,14寸可能会感觉小了,16又大了 15真的是黄金尺寸 另外这个电脑真的太重了,抬起来真的是感觉密度很大,超级沉重,是不是全部拿去放电池了 键盘的键程太长了,就是按着太费劲了,简直是来锻炼手指肌肉力量的,我一下子都有些不适应 我自己更换…

Django性能之道:缓存应用与优化实战

title: Django性能之道:缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories:后端开发tags:缓存系统 Redis优点 Memcached优缺点 Django缓存 数据库优化 性能监控 安全实践引言 在当今的互联网时代,用户对网站和应用程序的性能要求越来越高…

导数、偏导数、方向导数与梯度

目录导数偏导数全微分方向导数梯度参考 导数 导数是一元函数的概念. 函数\(y=f(x)\)在点\(x_0\)的某个邻域内有定义,自变量\(x\)在\(x_0\)处每取得\(\Delta x\)增量,因变量\(y\)取得\(\Delta y=f(x_0+\Delta x)-f(x_0)\)增量. 如果\(\Delta x\to 0\)时,极限\(\lim\limits_{\…

keil 添加HC32F005 Flash烧录目标的问题

1. 双击安装“HDSC.HC32F005.1.0.1.pack”,重启keil。 2.如果还不行,就将C:\Keil_v5\Packs\HDSC\HC32F005\1.0.1\Flash\HC32F005.FLM 复制到C:\Keil_v5\ARM\Flash目录下,保证可以。

【Nexus】通过nexus页面上传jar包依赖

如果直接只上传jar包不勾选Generate a POM file with these coordinates,将会导致依赖无法通过坐标引入 勾选Generate a POM file with these coordinates,自动生成的pom将不会自动引入依赖的传递依赖,也就是会缺依赖正确的上传姿势 同时上传jar包和pom文件,其中,pom文件通…