首页 > 其他分享 >P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

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

时间:2024-12-19 19:43:10浏览次数:3  
标签:lc int P4556 leq num rc Vani 救济粮 模板

[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\)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+100,INF=1e5;
struct segtree
{
    int val,lc,rc,num;
}s[N<<7];
vector<int >to[N];
int n,m,root[N],deg[N],tot,ans[N];
int dep[N],f[N],siz[N],son[N],top[N];

void go1(int u,int fa)
{
    f[u]=fa;
    siz[u]=1;
    dep[u]=dep[fa]+1;
    for(int i=0;i<deg[u];++i)
    {
        int v=to[u][i];
        if(v==fa)
            continue;
        go1(v,u);
        siz[u]+=siz[v];
        if(siz [ son[u] ] < siz[v])
            son[u]=v;
    }
}

void go2(int u,int tp)
{
    top[u]=tp;
    if(son[u])
        go2(son[u],tp);
    for(int i=0;i<deg[u];++i)
    {
        int v=to[u][i];
        if(v==son[u] || dep[v]<dep[u])
            continue;
        go2(v,v);
    }
}

int lca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]] < dep[top[y]])
            swap(x,y);
        x=f[top[x]];
    }
    if(dep[x]<dep[y])
        swap(x,y);
    return y;
}

void pushup(segtree &nw,segtree &lc,segtree &rc)
{
    nw.val=lc.val+rc.val;
    nw.num=max(lc.num,rc.num);
}

void upd(int &i,int l,int r,int x,int z)
{
    if(i==0)
        i=++tot;
    if(l==r)
    {
        s[i].val+=z;
        s[i].num=s[i].val;
        return ;
    }
    int mid=(l+r)>>1;
    if(x<=mid)
        upd(s[i].lc,l,mid,x,z);
    else
        upd(s[i].rc,mid+1,r,x,z);
    pushup(s[i],s[s[i].lc],s[s[i].rc]);
}

int que(int i,int l,int r)
{
    if(l==r)
        return l;
    int mid=(l+r)>>1,num=0;
    if(s[ s[i].lc ].num>=s[ s[i].rc ].num)
        num=que(s[i].lc,l,mid);
    else
        num=que(s[i].rc,mid+1,r);
    return num;
}

void merg(int &i,int &j,int l,int r)//i <-- j
{
    if(i==0 || j==0)
    {
        i+=j;
        return ;
    }
    if(l==r)
    {
        s[i].val+=s[j].val;
        s[i].num=s[i].val;
        return ;
    }
    int mid=(l+r)>>1;
    merg(s[i].lc,s[j].lc,l,mid);
    merg(s[i].rc,s[j].rc,mid+1,r);
    pushup(s[i], s[s[i].lc] , s[s[i].rc]);
}
void gotans(int u);

void init()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<n;++i)
    {
        scanf("%d%d",&x,&y);
        ++deg[x];
        ++deg[y];
        to[x].push_back(y);
        to[y].push_back(x);
    }
    go1(1,0);
    go2(1,1);
}

void work()
{
    for(int i=1,x,y,z;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        int ace=lca(x,y);
        upd(root[x],1,INF,z,1);
        upd(root[y],1,INF,z,1);
        upd(root[ace],1,INF,z,-1);
        if(f[ace]>0)
            upd(root[f[ace]],1,INF,z,-1);
    }
    gotans(1);
    for(int i=1;i<=n;++i)
        printf("%d\n",ans[i]);

}
void gotans(int u)
{
    for(int i=0,v;i<deg[u];++i)
    {
        v=to[u][i];
        if(dep[v]<dep[u])
            continue;
        gotans(v);
        merg(root[u],root[v],1,INF);
    }
    if(root[u]>0)
    ans[u]=que(root[u],1,INF);
}

int main()
{

    init();
    work();
    return 0;
}
















标签:lc,int,P4556,leq,num,rc,Vani,救济粮,模板
From: https://www.cnblogs.com/Glowingfire/p/18617814

相关文章

  • 实验6 模板类、文件I/O和异常处理
    实验任务4:Vector.hpp源码:1#pragmaonce2#include<iostream>3#include<stdexcept>4usingnamespacestd;56template<typenameT>7classVector{8public:9Vector(intn):size(n)10{11if(n<0)12......
  • 可以直接使用模板搭建虚拟展厅么?
    可以直接使用模板搭建虚拟展厅。以下是对这一方式的详细解释:一、模板搭建的可行性许多虚拟展厅搭建平台都提供了丰富的模板供用户选择。比如视创云展平台,就拥有海量展厅模板,适合多种行业使用。这些模板通常已经包含了基本的展厅结构和布局,用户只需在此基础上进行个性化调整,如......
  • 怎么修改网站底部模板,如何更改网站底部的模板文件
    修改网站底部模板可以帮助您自定义网站的外观和功能。以下是详细的步骤:登录后台管理系统:打开浏览器,输入后台管理地址(如http://yourdomain.com/admin.php或http://yourdomain.com/wp-admin),使用管理员账号登录。导航到主题编辑页面:在后台左侧菜单中,找到“外观”或“主题......
  • 实验6 模板类、文件I/O与异常处理
    实验四vector.hpp#pragmaonce#include<iostream>#include<stdexcept>usingnamespacestd;template<typenameT>classVector{private:intsize;T*ptr;public:Vector(intsize,intvalue=0):size{size}{......
  • 实验六 模板类、文件I/O和异常处理
    1、实验任务一Complex.hpp#pragmaonce#include<iostream>#include<stdexcept>//声明//////////////////////////////////////////////////////复数模板类声明template<typenameT>classComplex{public:Complex(Tr=0,Ti=0);Complex(co......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4:1#pragmaonce23#include<iostream>4#include<stdexcept>56usingnamespacestd;78template<typenameT>9classVector{10public:11Vector(intn,Tvalue=0);12~Vector();13Vec......
  • RealVNC旧版安装包及组策略模板下载方法
    msi安装包下载v6.2版本下载链接如下:https://downloads.realvnc.com/download/file/vnc.files/VNC-Server-6.2.0-Windows-msi.zip如需下载其他版本请替换下载链接中的VNC-Server-6.2.0-Windows为VNC-Server-x.x.x-Windows例如6.8.0版本:https://downloads.realvnc.com/downlo......
  • 软件项目可行性研究报告模板
    《[软件项目名称]可行性研究报告》一、总论项目背景简述项目提出的背景,包括相关行业的发展趋势、市场需求状况以及企业自身发展战略与该软件项目的关联等。项目概况项目名称、项目承办单位、项目负责人等基本信息。项目建设目标与主要内容概述,如软件系统的核心功能、预......
  • 大学生职业规划模板汇总(大学生职业规划大赛PPT模板)
    前言全国大学生职业规划大赛是由教育部举办的赛事,首届大赛于2023年9月至2024年5月举办,总决赛在上海市举行。生涯教育与就业指导工作贯穿高校招生、培养、就业全过程,是就业指导服务的核心内容、强化价值观引导的重要载体、促进毕业生高质量充分就业的基础工作。以全国大学生职业规......
  • Z-BlogPHP 报错“主题模板的编译文件不存在”,如何解决?
     当您在使用Z-BlogPHP时遇到“主题模板的编译文件不存在”的错误,通常是因为系统未能正确编译主题模板文件,导致无法正常显示网站内容。以下是一些解决此问题的方法:清空缓存并重新编译模板:登录Z-BlogPHP后台管理界面,进入首页。在首页中,找到并点击“清空缓存并重新编译模......