首页 > 其他分享 >Luogu P5563 [Celeste-B] No More Running

Luogu P5563 [Celeste-B] No More Running

时间:2024-08-07 18:40:09浏览次数:12  
标签:sz 取模 No int Luogu Celeste now mx dis

Celeste,启动!

稍作思考就会发现这题其实很简单,树上路径一眼考虑点分治

对于分治中心,很容易预先求出所有未处理的点到它的距离(模意义下),可以用这些信息来更新中心的答案

考虑剩下的某个未处理的点 \(x\),它的答案可能由 \(x\) 到分治中心的距离 \(dis_x\),拼上分治中心到另一个点 \(y\) 的距离 \(dis_y\) 构成

由于 \(dis_x\) 是已知的定值,且 \(dis_x,dis_y\in[0,mod)\),因此不难发现只要根据它们的和要取模/不取模两种情况讨论即可:

  • 若 \(dis_x+dis_y\) 不取模,则找到最大的 \(dis_y\) 满足 \(dis_y\le mod-1-dis_x\),用 \(dis_x+dis_y\) 更新答案
  • 若 \(dis_x+dis_y\) 取模,则直接找到最大的 \(dis_y\),用 \(dis_x+dis_y\) 对 \(mod\) 取模的值更新答案

multiset 维护一下,同时注意 \(dis_x\) 与 \(dis_y\) 不能来自同一子树这一老生常谈的问题即可

总复杂度 \(O(n\log^2 n)\)

#include<cstdio>
#include<iostream>
#include<set>
#include<vector>
#define RI register int
#define CI const int&
using namespace std;
typedef pair <int,int> pi;
const int N=100005,INF=1e9;
int n,mod,x,y,z,ans[N],dis[N]; vector <pi> v[N]; multiset <int> s;
namespace Point_Divide
{
    int rt,ots,sz[N],mx[N]; bool vis[N];
    inline void getrt(CI now=1,CI fa=0)
    {
        sz[now]=1; mx[now]=0;
        for (auto [to,w]:v[now]) if (to!=fa&&!vis[to])
        getrt(to,now),sz[now]+=sz[to],mx[now]=max(mx[now],sz[to]);
        if (mx[now]=max(mx[now],ots-sz[now]),mx[now]<mx[rt]) rt=now;
    }
    inline void insert(CI now,CI fa=0)
    {
        s.insert(dis[now]); for (auto [to,w]:v[now])
        if (to!=fa&&!vis[to]) dis[to]=(dis[now]+w)&mod,insert(to,now);
    }
    inline void remove(CI now,CI fa=0)
    {
        s.erase(s.find(dis[now])); for (auto [to,w]:v[now])
        if (to!=fa&&!vis[to]) dis[to]=(dis[now]+w)&mod,remove(to,now);
    }
    inline void calc(CI now,CI fa=0)
    {
        auto it=s.upper_bound(mod-dis[now]);
        if (it!=s.begin()) ans[now]=max(ans[now],dis[now]+*(--it));
        if (!s.empty()) ans[now]=max(ans[now],(dis[now]+*s.rbegin())&mod);
        for (auto [to,w]:v[now]) if (to!=fa&&!vis[to]) calc(to,now);
    }
    inline void solve(CI now)
    {
        vis[now]=1; dis[now]=0; insert(now);
        ans[now]=max(ans[now],*s.rbegin());
        for (auto [to,w]:v[now]) if (!vis[to])
        remove(to),calc(to),insert(to); s.clear();
        for (auto [to,w]:v[now]) if (!vis[to])
        mx[rt=0]=INF,ots=sz[to],getrt(to,now),solve(rt);
    }
    inline void divide(CI n)
    {
        mx[rt=0]=INF; ots=n; getrt(); solve(rt);
    }
};
using namespace Point_Divide;
int main()
{
    scanf("%d%d",&n,&mod); --mod;
    for (RI i=1;i<n;++i) scanf("%d%d%d",&x,&y,&z),v[x].push_back(pi(y,z)),v[y].push_back(pi(x,z));
    divide(n); for (RI i=1;i<=n;++i) printf("%d\n",ans[i]);
    return 0;
}

标签:sz,取模,No,int,Luogu,Celeste,now,mx,dis
From: https://www.cnblogs.com/cjjsb/p/18347631

相关文章

  • node.js: mysql sequelize in WebStorm 2023.1
    mysql:select*fromtutorials;#CREATETABLEIFNOTEXISTS`tutorials`(`id`INTEGERNOTNULLauto_increment,`title`VARCHAR(255),`description`VARCHAR(255),`published`TINYINT(1),`createdAt`DATETIMENOTNULL,`updatedAt`DATETIMENOTNULL,PRIMA......
  • NOIP 2012 提高组初赛试题
    第1题目前计算机芯片(集成电路)制造的主要原料是(),它是一种可以在沙子中提炼出的物质。 A.硅 B.铜 C.锗 D.铝本题共1.5分第2题()是主要用于显示网页服务器或者文件系统的HTML文件内容,并让用户与这些文件交互的一种软件。 A.资源管理器 B.浏览器 C.......
  • INLINE Data Link Adapters for Engine Diagnostics
    INLINEdatalinkadaptersaredesignedtofacilitatecommunicationbetweentheengine'sECM(ElectronicControlModule)anddiagnostictools.Availableinthreemodels,theseadapterscanbesourcedfromyourlocalCumminsdealerordistributor:INLIN......
  • 修改.gitignore里面曾经追踪过的文件变成不追踪
    .gitignore 只能忽略那些原来没有被追踪(tracked)的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的解决方法就是,先把本地缓存删除(改成未track状态),然后再提交:gitrm-r--cached.gitadd.gitcommit-m'update.gitignore'gitpush 具体步骤如下......
  • 【CANoe制作DataBase(DBC文件)】
            本篇是CANoe使用制作DBC文件,DBC是DatabaseCan的缩写,其代表的是CAN的数据库文件,里面定义了CAN总线上有哪些CAN节点、每个节点各自发出什么CAN报文,每个报文下又有哪些信号,CAN总线不管是开发、测试还是分析,DBC文件都是必不可少的。目录        本篇......
  • 锡耶纳大学与 NocoBase:教育管理系统的全新篇章
    关于锡耶纳大学锡耶纳大学(意大利语:UniversitàdegliStudidiSiena,简称UNISI)建于1240年,是欧洲最古老的大学之一。如今,锡耶纳大学以其法学院和医学院闻名。这所著名的大学坐落在意大利托斯卡纳的中心,其影响力遍及阿雷佐、格罗塞托和圣乔凡尼瓦尔达尔诺等城市,并在15个学科部......
  • node.js 多版本管理 nvm的安装和使用
    #安装nvm#项目链接#https://github.com/nvm-sh/nvm#1、安装与更新使用curl或wgetcurl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh|bash#或wget-qO-https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh|bash#......
  • ssh 远程登录报错:Unable to negotiate with IP port 22: no matching host key type f
    最近在Mac上想要远程一台Linux服务器,结果不知怎么的就不能使用以前的ssh登录了iot@ios-iMac~%[email protected]:nomatchinghostkeytypefound.Theiroffer:ssh-rsa,ssh-dss ......
  • 【NOI】C++算法设计入门之穷举
    文章目录前言一、概念1.导入2.概念二、例题讲解1.简单穷举问题:1015.鸡兔同笼问题问题:1351.买公园门票问题:1016.买小猫小狗问题:1220.买糕点问题:1396.开学大采购?2.嵌套穷举问题:1022.百钱百鸡问题问题:1024.购买文具问题:1249.搬砖问题问题:1250.马克思手稿的问题......
  • com.alibaba.fastjson 将object装jsonObject两次字段顺序会出现不一致
    Objectentity=params.get("entity");JSONObjectjsonObject=(JSONObject)JSONObject.toJSON(entity);//遍历JSONObjectfor(Map.Entry<String,Object>entry:jsonObject.entrySet())以上代码,在同一个object,两次经过的到时候,遍历J......