[WC2010]重建计划(长链剖分+线段树+分数规划)

看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径。设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复杂度O(nlog2n)

不知为什么bzoj上RE,luogu上AC,暂时不管了。

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=2e5+7;
int n,L,R,cnt,tot,hd[N],v[N],nxt[N],w[N],son[N],sv[N],dep[N],dfn[N];
double mid,ans,s[N<<2],val[N],f[N];
void add(int x,int y,int z){v[++tot]=y,nxt[tot]=hd[x],w[tot]=z,hd[x]=tot;}
void dfs1(int u,int fa)
{
    for(int i=hd[u];i;i=nxt[i])
    if(v[i]!=fa)
    {
        dfs1(v[i],u);
        if(dep[v[i]]>=dep[son[u]])son[u]=v[i],sv[u]=w[i];
        if(dep[v[i]]+1>dep[u])dep[u]=dep[v[i]]+1;
    }
}
void dfs2(int u,int fa)
{
    dfn[u]=++cnt;
    if(son[u])dfs2(son[u],u);
    for(int i=hd[u];i;i=nxt[i])if(v[i]!=fa&&v[i]!=son[u])dfs2(v[i],u);
}
void update(int k,double v,int l,int r,int rt)
{
    if(l==r){s[rt]=max(s[rt],v);return;}
    int mid=l+r>>1;
    if(k<=mid)update(k,v,lson);else update(k,v,rson);
    s[rt]=max(s[rt<<1],s[rt<<1|1]);
}
double query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)return s[rt];
    int mid=l+r>>1;double ret=-2e9;
    if(L<=mid)ret=max(ret,query(L,R,lson));
    if(R>mid)ret=max(ret,query(L,R,rson));
    return ret;
}
void dfs(int u,int fa)
{
    int id=dfn[u];
    if(son[u])dfs(son[u],u),val[id]=val[id+1]+sv[u]-mid;
    update(id,f[id]=-val[id],1,n,1);
    if(dep[u]>=L)
    {
        double tmp=query(id+L,id+min(dep[u],R),1,n,1);
        ans=max(ans,tmp+val[id]);
    }
    for(int i=hd[u];i;i=nxt[i])
    if(v[i]!=fa&&v[i]!=son[u])
    {
        int idv=dfn[v[i]];
        dfs(v[i],u);
        for(int j=0;j<=dep[v[i]];j++)
        {
            int l=id+max(0,L-j-1),r=id+min(dep[u],R-j-1);
            double tmp=query(l,r,1,n,1);
            ans=max(ans,tmp+val[idv]+val[id]+f[idv+j]+w[i]-mid);
        }
        for(int j=0;j<=dep[v[i]];++j)
        {
            double tmp=val[idv]+f[idv+j]+w[i]-mid-val[id];
            if(tmp>f[id+j+1])update(id+j+1,f[id+j+1]=tmp,1,n,1);
        }
    }
}
bool check()
{
    for(int i=0;i<(N<<2);i++)s[i]=-2e9;
    ans=-2e9,dfs(1,0);
    return ans>=1e-4;
}
int main()
{
    scanf("%d%d%d",&n,&L,&R);
    for(int i=1,x,y,z;i<n;i++)scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
    dfs1(1,0),dfs2(1,0);
    double l=0,r=1e6;
    while(r-l>1e-4)
    {
        mid=(l+r)/2;
        if(check())l=mid;else r=mid;
    }
    printf("%.3lf",l);
}
View Code

 

转载于:https://www.cnblogs.com/hfctf0210/p/10905815.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值