花花的森林

从零开始:kohya_ss环境部署与LoRA/SDXL模型训练实战指南 本文提供了一份详细的kohya_ss环境部署与模型训练实战指南。从零开始,手把手教你使用Conda创建虚拟环境、安装依赖并启动Web GUI界面。核心内容涵盖高质量数据集的准备方法,并重点解析了如何使用kohya_ss工具进行LoRA模型和SDXL模型的微调训练,包括关键参数配置与常见报错解决方案,帮助初学者快速上手AI绘画模型定制。 阅读详情

题目描述
花花有一棵带n 个顶点的树T,每个节点有一个点权ai。
有一天,他认为拥有两棵树更好一些。所以,他从T 中删去了一条边。
第二天,他认为三棵树或许又更好一些。因此,他又从他拥有的某一棵树中去除了一条边。
如此往复。每一天,花花都会删去一条尚未被删去的边,直到他得到了一个包含了n 棵只有一个点的树的森林。
定义一条简单路径的权值为路径上点权之和,一棵树的直径为树上权值最大的简单路径。
花花认为树最重要的特征就是它的直径。所以他想请你算出任一时刻他拥有的所有树的直径的乘积。因为这个数可能很大,他要求你输出乘积对109+7 取模之后的结果。

输入
输入的第一行包含一个整数n,表示树T 上顶点的数量。
下一行包含n 个空格分隔的整数ai,表示顶点的权值。
之后的n-1 行中,每一行包含两个用空格分隔的整数xi 和yi,表示节点xi 和yi 之间连有一条边,编号为i。
再之后n-1 行中,每一行包含一个整数kj,表示在第j 天里会被删除的边的编号
输出
输出n 行。
在第i 行,输出删除i-1 条边之后,所有树直径的乘积对10^9 + 7 取模的结果。

样例输入
3
1 2 3
1 2
1 3
2
1
样例输出
6
9
6
提示
初始,树的直径为6(由节点2、1 和3 构成的路径)。在第一天之后,得到了两棵直径都为3 的树。第二天之后,得到了三棵直径分别为1,2,3 的树,乘积为6。
• 对于40% 的数据:N<=100;
• 另有20% 的数据:N<=1000;
• 另有20% 的数据:N<=104;
• 对于100% 的数据:N<=105;ai<=104。

Solution

根据一贯的套路,这种删除边的问题很多都是倒着添边做的。
那我们就来考虑倒着做
最后树成了n个点的森林
每次合并两棵树,除去原来两棵树的直径,乘上合并后的新直径
除直径用乘逆元
那么现在的问题就是:如何快速得出两棵树合并后产生的新直径。
考试的时候,我这个渣渣当然不会了,于是我就暴力更新一条链,极限接近n2,但快得出奇,100000的随机数据都只需要0.8s
其实,关于直径又有一个套路,当两棵子树合并的时候,x树的直径两端点是a b,y树的直径两端点是c d,则新直径必定是abcd的某个点对。
求路径用LCA
结果我发现正解比暴力慢了1倍

暴力

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int n,x,y,u,tot;
int st[100005],ed[100005],a[100005],cut[100005],f[100005];
int s[100005],fa[100005],d[100005];
int head[100005],Next[200005],to[200005];
ll now,ans[100005];
void dfs(int k,int pre)
{
    fa[k]=pre;
    for(int i=head[k];i!=-1;i=Next[i]) 
    if(to[i]!=pre) dfs(to[i],k);
}
void add(int x,int y)
{
    tot++;
    Next[tot]=head[x];
    to[tot]=y;
    head[x]=tot;
}
int get(int x)
{
    if(f[x]==x) return x; else return f[x]=get(f[x]);
}
void update(int k)
{
    int s1=0,s2=0;
    for(int i=head[k];i!=-1;i=Next[i]) 
    if(fa[to[i]]==k) 
    {
        if(s[to[i]]>s1) 
        {
            s2=s1;
            s1=s[to[i]];
        }
        else
        if(s[to[i]]>s2) s2=s[to[i]];
        d[k]=max(d[k],d[to[i]]); 
    }
    s[k]=s1+a[k];
    d[k]=max(d[k],s1+s2+a[k]);
    if(k!=u) update(fa[k]); else return;
}
ll ny(ll x,ll y)
{
    ll p=1;
    while(y>0) 
    {
        if(y%2==1) p=(p*x)%mod;
        y=y/2;
        x=(x*x)%mod;
    }
    return p;
}
void prepare()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        head[i]=-1;
        scanf("%d",&a[i]); 
    }
    for(int i=1;i<n;i++) 
    {
        scanf("%d%d",&st[i],&ed[i]);
        add(st[i],ed[i]);
        add(ed[i],st[i]);
    }
    dfs(1,0);
    for(int i=1;i<n;i++) scanf("%d",&cut[i]);
    tot=0;
    for(int i=1;i<=n;i++) 
    {
        f[i]=i;
        d[i]=(ll)(a[i]);
        s[i]=a[i];
        head[i]=-1;
    }
    ans[n]=1;
    for(int i=1;i<=n;i++) ans[n]=(ans[n]*a[i])%mod;
    now=ans[n]; //现在的直径乘积 
}   
int main()
{
    prepare();
    for(int i=n-1;i>=1;i--) 
    {
        x=st[cut[i]],y=ed[cut[i]];
        add(x,y);
        add(y,x);
        if(fa[x]==y) 
        {
            u=get(y);
            f[x]=u;
            now=(now*ny((ll)(d[x]),mod-2))%mod;
            now=(now*ny((ll)(d[u]),mod-2))%mod; 
            update(y);
            now=(now*d[u])%mod;
        }
        else
        {
            u=get(x);
            f[y]=u;
            now=(now*ny((ll)(d[y]),mod-2))%mod;
            now=(now*ny((ll)(d[u]),mod-2))%mod; 
            update(x); 
            now=(now*d[u])%mod;
        }
        ans[i]=now;
    }
    for(int i=1;i<=n;i++) printf("%lld\n",ans[i]); 
    return 0;
}

正解

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int n,x,y,ty,i1,i2,dis,dad,tot;
int u[100005],v[100005],b[5];
int st[100005],ed[100005],a[100005],cut[100005];
int fa[100005][20],d[100005],f[100005],s[100005];
int head[100005],Next[200005],to[200005],deep[100005];
ll now,ans[100005];
void dfs(int k,int pre)
{
    fa[k][0]=pre;
    deep[k]=deep[pre]+1;
    s[k]=s[pre]+a[k];
    for(int i=head[k];i!=-1;i=Next[i]) 
    if(to[i]!=pre) dfs(to[i],k);
}
void add(int x,int y)
{
    tot++;
    Next[tot]=head[x];
    to[tot]=y;
    head[x]=tot;
}
int get(int x)
{
    if(f[x]==x) return x; else return f[x]=get(f[x]);
}
ll ny(ll x,ll y)
{
    ll p=1;
    while(y>0) 
    {
        if(y%2==1) p=(p*x)%mod;
        y=y/2;
        x=(x*x)%mod;
    }
    return p;
}
void prepare()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        head[i]=-1;
        scanf("%d",&a[i]); 
    }
    for(int i=1;i<n;i++) 
    {
        scanf("%d%d",&st[i],&ed[i]);
        add(st[i],ed[i]);
        add(ed[i],st[i]);
    }
    dfs(1,0);
    for(int i=1;(1<<i)<=n;i++) 
    for(int j=1;j<=n;j++) fa[j][i]=fa[fa[j][i-1]][i-1];
    for(int i=1;i<n;i++) scanf("%d",&cut[i]);
    tot=0;
    for(int i=1;i<=n;i++) 
    {
        f[i]=i;
        u[i]=v[i]=i;
        d[i]=(ll)(a[i]);
        head[i]=-1;
    }
    ans[n]=1;
    for(int i=1;i<=n;i++) ans[n]=(ans[n]*a[i])%mod;
    now=ans[n]; //现在的直径乘积 
}
int LCA(int x,int y)
{
    if(deep[x]<deep[y]) swap(x,y);
    for(int i=18;i>=0;i--) 
    if(deep[x]-(1<<i)>=deep[y]) x=fa[x][i];
    if(x==y) return x;
    for(int i=18;i>=0;i--) 
    if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
int main()
{
    prepare();
    for(int i=n-1;i>=1;i--) 
    {
        x=st[cut[i]],y=ed[cut[i]];
        add(x,y);
        add(y,x);
        if(fa[x][0]==y) 
        {
            ty=get(y);
            f[x]=ty;
            b[1]=u[x],b[2]=v[x],b[3]=u[ty],b[4]=v[ty];
            i1=i2=dis=0;
            for(int j=1;j<=4;j++) 
            for(int k=1;k<=4;k++) 
            {
                dad=LCA(b[j],b[k]);
                if(s[b[j]]+s[b[k]]-2*s[dad]+a[dad]>dis) 
                {
                    dis=s[b[j]]+s[b[k]]-2*s[dad]+a[dad];
                    i1=b[j];
                    i2=b[k];
                }
            }
            now=(now*ny((ll)(d[x]),mod-2))%mod;
            now=(now*ny((ll)(d[ty]),mod-2))%mod; 
            d[ty]=dis,u[ty]=i1,v[ty]=i2;
            now=(now*d[ty])%mod;
        }
        else
        {
            ty=get(x);
            f[y]=ty;
            b[1]=u[y],b[2]=v[y],b[3]=u[ty],b[4]=v[ty];
            i1=i2=dis=0;
            for(int j=1;j<=4;j++) 
            for(int k=1;k<=4;k++) 
            {
                dad=LCA(b[j],b[k]);
                if(s[b[j]]+s[b[k]]-2*s[dad]+a[dad]>dis) 
                {
                    dis=s[b[j]]+s[b[k]]-2*s[dad]+a[dad];
                    i1=b[j];
                    i2=b[k];
                }
            }
            now=(now*ny((ll)(d[y]),mod-2))%mod;
            now=(now*ny((ll)(d[ty]),mod-2))%mod;
            d[ty]=dis,u[ty]=i1,v[ty]=i2; 
            now=(now*d[ty])%mod;
        }
        ans[i]=now;
    }
    for(int i=1;i<=n;i++) printf("%lld\n",ans[i]); 
    return 0;
}
等保2.0下可信验证的动态实现与合规实践 本文深入解读等保2.0标准中的“可信验证”要求,并重点探讨其动态实现与合规实践。文章阐述了从可信根、信任链到动态验证的核心概念,拆解了不同安全等级的实施差异,并提供了从硬件选型、软件赋能到平台集成的四步落地指南。通过行业案例与避坑心得,为构建覆盖计算环境、区域边界、通信网络和安全管理中心的全链条可信防御体系提供了实用参考。 阅读详情

相关推荐

CESM笔记——CESM1.0-CESM1.2.2-CESM2.1.3三个版本模式工作流对比

最近测试了CESM1.0,CESM1.2.2和CESM2.1.3三个版本,不同版本在workflow上有一些区别,来做点笔记。 CESM1.0 测试compset:B_2000,F_2000 workflow: 1. create_newcase -case ~/CESM/cesm1_0/script/B_2000 -compset B_2000 -res f19_g16 -mach tianhe 2. cd B_2000 (optional) env_mach_pes.xml ##修改核数,

砍柴姑娘Jourosy的博客 4944

【NOIP模拟】花花森林

题面 花花有一棵带 n 个顶点的树 T,每个节点有一个点权 ai。 有一天,他认为拥有两棵树更好一些。所以,他从 T 中删去了一条边。 第二天,他认为三棵树或许又更好一些。因此,他又从他拥有的某一棵树中去除了一条边。 如此往复。每一天,花花都会删去一条尚未被删去的边,直到他得到了一个包含了 n 棵只有一个点的树的森林。 定义一条简单路径(顶点不重复的路径)的权值为路径上点权之和...

Ashley_2013的博客 270

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

【题解】10-19秀秀的森林(forest)

我恨秀秀倍增LCA+离线 (时光倒流) 题目 秀秀有一棵带n个顶点的树T,每个节点有一个点权ai-。有一天,她想拥有两棵树,于是她从T中删去了一条边。第二天,她认为三棵树或许会更好一些。因此,她又从她拥有的某一棵树中删去了一条边。如此往复,每一天秀秀都会删去一条尚未被删去的边,直到她得到由n棵只有一个点的树构成的森林。秀秀定义一条简单路径(节点不重复出现的路径)的权值为路径上所有点的权值之...

weixin_30555753的博客 273

Jetson nano/nx使用麒麟arm版向日葵实现远程控制

Jetson nano/nx使用麒麟arm版向日葵实现远程控制1、安装向日葵软件2、运行Sunlogin Client3、向日葵闪退问题4、重启系统5、重启后黑屏问题 特别提醒: 本博客的第3步切换桌面管理环境到lightdm,存在重启后开机黑屏的风险,我在自己的nano/nx上都没有问题,但帮一个同学的nx配置时,切换到lightdm,重启开机却出现了黑屏,所以执行第3步的话要有心理准备,黑屏解决方法见第5步,特此提醒。

胡乱学点东西 2万+

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究

WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。

m0_57411304的博客 1716

LeetCode刷题(每日一题) --1489. 找到最小生成树里的关键边和伪关键边(并查集)

题目 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。 请你找到给定图中最小生成树的所有关键边和伪关键边。如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可能会出现在某些最小生成树中但不会出

Hanzoe的博客 514

200_matlab处理NCEP数据并画全球彩色的风场图

200_matlab处理NCEP数据并画全球彩色的风场图。

miaobo0的博客 1240

花花的森林forest

花花的森林forest维护树的直径·并查集题目大意:花花有一棵带 n 个顶点的树 T,每个节点有一个点权ai a_i 。 有一天,他认为拥有两棵树更好一些。所以,他从 T 中删去了一条边。 第二天,他认为三棵树或许又更好一些。因此,他又从他拥有的某一棵树中去除了一条边。 如此往复。每一天,花花都会删去一条尚未被删去的边,直到他得到了一个包含了 n 棵只有一个点的树的森林。 定义一条简单路径1

FTM's Blog 629

SoulX-FlashHead 加速实践,提升3倍。

SoulX-FlashHead 加速实践,提升3倍。

jacke121的专栏 224

[QMT量化交易小白入门]-三十四、让deepseek分析北京炒家的首板策略后,在打板前增加了选股范围(量化python代码解析)

print(f'开始盘前选股')这行代码定义了一个名为的函数,当调用这个函数时,会首先打印出“开始盘前选股”的信息,表明选股流程正式启动。1、可根据情况增删部分条件,目前盘前选股目前可以选出140多支,比之前全市场监听带宽压力小了很多。2、还可以自行添加其他选股条件,比如换手率计算,炸板可能性检测。3、xtdata的数据是有可能缺失的,自己写策略时,有可能需要剔除,或者从第三方库校正,比如部分股票的流通股数。

木头大左的博客 2699

花花的森林(倍增,LCA

花花的森林,嗯,这是一篇正经的题解。 模拟考的时候没有看出来要怎么求啊,暴力地树形DP、换根、合并、求直径。居然也险险地拿到了80分,不过我们要正经地想正解。 容易想到我们可以让时光倒流,让空间扭转,离线地从最后一次操作往前,这样删边就变成加边了(合并总比拆开好做吧) 首先,我们要知道,两棵树合并后,新直径的两个端点一定是原来两棵树的两个直径的四个不同端点中的某两个(为什么...

194

YoloV8改进策略:主干网络篇|MobileNetV4主干替换YoloV8的BackBone(独家原创)

今年,轻量级王者MobileNetV4闪亮登场!在我们这篇文章里,我们把MobileNetV4加入到了YoloV8中,替换原有的BackBone。哈哈,你猜怎么着?效果超赞!文章里详细记录了改进过程,给那些正在为创新点子发愁的小伙伴们提供了满满的灵感。嘿,想要发表关于轻量级改进的论文?这篇文章绝对是你的首选参考!

m0_47867638的博客 3192

JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description Input Output Sample Input 3 1 2 3 1 2 1 3 2 1 Sample Output 6 9 6 D

py_2017的博客 514

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【NOIP2017提高A组模拟8.16】花花的森林

分析删边是很难的, 所以我们反过来,从后往前加边。我们知道树的直径有一个性质, 当两个树合并的时候, 新树的直径的两个端点一定是原来两棵树的四个端点中的两个。 证明比较简单。我们就先在原树上面预处理倍增数组, 对于每棵树,我们记录它直径的长度,以及两个端点。 合并的时候就用四个端点两两之间跑lca。code#include<cstdio> #include<iostream> #incl

lijf2001的博客 411

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

轻松集齐五福,还有花花,原来你要扫的福字都在这里!

本文帮你整理了支付宝集福活动中可以扫的所有福字,每天可以收集多达二十多张福,想不集齐都困难,只需要每天坚持扫一扫,五福,花花都到碗里来! 最后的时间,抓紧收集五福卡,除夕当晚会随机瓜分5亿现金红包哦,还有帮你还花呗的锦鲤哦! 现在每个帐号每天最多可以得到22张福卡。看下面的攻略,依次扫!!! 现在每个帐号每天最多可以得到22张福卡。看下面的攻略,依次扫!!! 现在每个帐号每天最多可以得到2...

我在全球村 1914

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JZOJ.5286【NOIP2017模拟8.16】花花的森林

Description Input Output Sample Input 3 1 2 3 1 2 1 3 2 1 Sample Output 6 9 6 Data Constraint Hint 题目大意就是要求删边和计算直...

dawzski22234的博客 145

JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林

JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 DescriptionInputOutputSample Input3 1 2 3 1 2 1 3 2 1Sample Output6 9 6Data ConstraintHintSolutionCode#include<cstdio> #include<algorithm> #include<cmath>

Felix-Lee的博客 596

轻松集福,支付宝集五福活动完整攻略

  2019支付宝集五福活动正式开启了,从1月25日到2月4日除夕,用户可以在这段时间内收集五福卡,除夕当晚会随机瓜分5亿现金红包。 1,正常集福流程   只要打开支付宝最新版,就可以在首页看到集五福入口,用户可以通过AR扫描“福”字来进行集福活动。     废话不多说,我们一起来看看今年的集五福游戏怎样才能最快达成。除了往年的AR扫一扫集福和蚂蚁森林浇水得福卡外,今年还新增了答...

我在全球村 2787

支付宝获取敬业福套路,成功率高达99%

新年又马上到了,套路福又开始玩起来,今年貌似比较好收集,嘟嘟已经全部搞定了。这里给大家支招,如何用正确的姿势获取最难的敬业福,貌似还多了花花卡。常规攻略每天嘟嘟可以获取7...

嘟爷java超神学堂 1058

【jzoj5286】【NOIP2017提高A组模拟8.16】【花花的森林 】【时间倒流】

题目大意解题思路离线时间倒流,逐渐加边,用并查集维护连通块直径,可以发现两个连通块合并新直径,一定是原来直径四个点组合之一,倍增算一下即可。code#include<set> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long #define fo(i,j,k) for

inklutcuah’s blog 350

红包规则_支付宝花花卡获得攻略及红包奖励规则 支付宝五福福字大全

[海峡网]花花卡主要是通过支付宝集五福方式获取,是随机的,大家可以通过积极参与集五福活动,就有机会获得花花卡。另外值得一提的是,花花卡还可以相互赠送。简单来说,支付宝花花卡的获取方式,和爱国福、富强福、和谐福、友善福、敬业福是一样的,大家可以通过AR扫福字、蚂蚁森林浇水和支付宝好友之间相互赠送来获得福卡。支付宝集五福花花卡活动详情:开奖时间:2019年2月4日21:20分活动奖励:全年帮你还花呗大...

weixin_42102634的博客 366

2920集五福_2019支付宝集五福字新玩法,高概率出敬业福攻略。

还是熟悉的配方,还是熟悉的味道。今天(2019年1月25日)凌晨,集五福活动正式开启,支付宝客户端首页也更新了大大的“集五福”入口。据介绍,今年的支付宝集五福活动将保留了去年几乎被玩坏的“AR扫福字”、森林浇水、庄园喂小鸡等主要玩法,并新增答题得福卡方式,题目将以安全教育为主。2019支付宝春节扫福时间1月21日,支付宝五福项目组正式宣布,今年的支付宝集五福在1月25(本周五)正式开始,并公布了相...

weixin_39886024的博客 614
上一篇: 计算几何
下一篇: 宝藏
ACTY
博客等级 码龄12年 21粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值