F. Almost All

题意

填边使得树的两点之间距离可以遍历 1 t o 2 n 2 9 1\quad to\quad\frac{2n^2}{9} 1to92n2所有整数。

题解

证明

1

分配数字给边,对于一棵树,如果要使得根节点到每个点的距离分别为 a 1 , a 2 , a 3 , . . . , a n a_1,a_2,a_3,...,a_n a1,a2,a3,...,an
有这样的解决方法,首先分配最上面的结点即根节点的孩子, a 1 a_1 a1 a k a_k ak,对于这些孩子的孩子,分别是 a k + 1 − a 1 a_{k+1}-a_1 ak+1a1,减去前面的前缀和即可,只要你保证,是排好序的,这样就不会出现负值。

2

对于以重心为根节点的树,你的每棵子树节点数都 ≤ n 2 \leq \frac{n}{2} 2n
我们能否分成两部分,每一部分都有至少 1 3 \frac{1}{3} 31的结点。

我们分离的时候,排序子树大小,选前 k k k个刚好大于等于 n − 1 3 \frac{n-1}{3} 3n1
刚好不满足的左边子树大小和是 L L L x x x是加上满足了, R R R是右边的
L ≤ 1 / 3 , L + x ≥ 1 / 3 , R ≥ x , L + x + R = n − 1 L\leq 1/3,L+x \geq1/3,R \geq x,L+x+R=n-1 L1/3,L+x1/3,Rx,L+x+R=n1
显然 R ≥ n − 1 / 3 R\geq n-1/3 Rn1/3

3

在满足了第 1 , 2 1,2 1,2点,我们就可以分成左右部分 a a a b b b
左边的距离是 1 , . . . , a 1,...,a 1,...,a,右边的距离是 ( a + 1 ) , 2 ( a + 1 ) , . . . , b ( a + 1 ) (a+1),2(a+1),...,b(a+1) (a+1),2(a+1),...,b(a+1)
左边表示的距离是 1 , . . . a 1,...a 1,...a
右边第一个, a + 1 a+1 a+1,结合左边之后, a + 2 , . . . , 2 a + 1 a+2,...,2a+1 a+2,...,2a+1,刚好接上第二个。
最后能表示的距离是, ( b + 1 ) ( a + 1 ) − 1 (b+1)(a+1)-1 (b+1)(a+1)1,因为 a ≥ n − 1 3 a\geq \frac{n-1}{3} a3n1, b ≥ n − 1 3 , a + b = n − 1 b\geq \frac{n-1}{3},a+b=n-1 b3n1,a+b=n1
最小的距离是: ( n − 1 + 3 ) ( 2 n − 2 + 3 ) 9 − 1 ≥ 2 n 2 9 \frac{(n-1+3)(2n-2+3)}{9}-1\geq \frac{2n^2}{9} 9(n1+3)(2n2+3)192n2

根据以上三点,其实好像 1 1 1 3 3 3就够了,但是要证明满足了 1 3 \frac{1}{3} 31,右边还存在子树,所以…

接下来就是先求重心,算子树大小,排序,分别把左右的处理了即可。

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
#define inf 1e18
using namespace std;
typedef long long ll;
const int maxn = 405000;
 
vector<int>G[maxn];
int n,sz[maxn],mx=0x3f3f3f3f,rt=0;
int val[maxn];
 
void dfs1(int u,int fa){
    sz[u]=1;
    int tmp=0;
    for(auto v:G[u]){
        if(v==fa)continue;
        dfs1(v,u);
        tmp=max(tmp,sz[v]);
        sz[u]+=sz[v];
    }
    tmp=max(tmp,n-sz[u]);
    if(tmp<mx){
        mx=tmp;
        rt=u;
    }
}
 
void dfs2(int u,int fa){
    sz[u]=1;
    for(auto v:G[u]){
        if(v==fa)continue;
        dfs2(v,u);
        sz[u]+=sz[v];
    }
}
 
int base,tot;
pair<int,int>p[maxn];
 
void dfs(int u,int fa){
    cout<<fa<<" "<<u<<" "<<tot*base-val[fa]<<endl;
    val[u]=tot*base;
    tot++;
    for(auto v:G[u]){
        if(v==fa)continue;
        dfs(v,u);
    }
}
 
 
int main(){
    cin>>n;
    FOR(i,1,n-1){
        int u,v;
        sf(u),sf(v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    dfs1(1,-1),dfs2(rt,-1);
    FOR(i,1,G[rt].size())p[i]=make_pair(sz[G[rt][i-1]],G[rt][i-1]);
    int m=G[rt].size();
    sort(p+1,p+1+m);
    int mid=0,ret=0;
    FOR(i,1,m){
        ret+=p[i].first;
        if(ret>=(n-1)/3){
            mid=i;
            break;
        }
    }
    //FOR(i,1,m)cout<<p[i].second<<" "<<p[i].first<<endl;
    //cout<<rt<<endl;
    tot=1,base=1;
    FOR(i,1,mid)dfs(p[i].second,rt);
    tot=1,base=ret+1;
    FOR(i,mid+1,m)dfs(p[i].second,rt);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值