Truck Delivery - Google Kickstart Round B 2021

Truck Delivery - Google Kickstart Round B 2021第四题

Charles is a truck driver in the city of Googleland. Googleland is built in form of a tree with N nodes where each node represents a city and each edge represents a road between two cities. The cities are numbered 1 to N. The capital of Googleland is city 1. Each day Charles picks up a load of weight W in city C and wants to deliver it to city 1 using the simple path (which is unique) between the cities. Each road i has a toll which charges amount Ai if the weight of the load is greater than or equal to a load-limit Li.
Charles works for Q days, where for each day Charles will be given the starting city C and weight of the load W. For each day find the greatest common divisor of all the toll charges that Charles pays for that day. If Charles did not have to pay in any of the tolls the answer is 0.

题目大意:

Googleland是一个树形图,一共有N( 1 ≤ N ≤ 2 × 1 0 4 1\leq N\leq2\times10^4 1N2×104)座城市。 城市中的道路都是双向边,道路 i i i会对重量至少为 L [ i ] L[i] L[i](每条道路不同)的车辆收取 a [ i ] a[i] a[i]的过路费( 1 ≤ a [ i ] ≤ 1 0 18 1\leq a[i]\leq10^{18} 1a[i]1018)。Charles每天要从城市C把重量为W( 1 ≤ W , L [ i ] ≤ 2 × 1 0 5 1\leq W,L[i]\leq2\times10^5 1WL[i]2×105)的货物以简单路径运输到城市1,求每天Charles交去的过路费的最大公约数(若不用交费则答案为0)。

思路分析:

题目提示比较明显是一道线断树题目。注意到每条道路的载重不同,我们可以以载重为轴建立线段树,然后合并时取最大公约数即可。我们以深搜序遍历每个顶点,每到一个顶点就更新线段树当前位置的值为 a [ i ] a[i] a[i],删除时再改回0(这样对最大公约数计算无影响),询问时只需要区间查询载重为1到w的点值的最大公约数即可。我们只在每一个顶点处更新2次,对于每一天做一次询问,每次询问或更新要乘上一个求最大公约数的复杂度,所以算法复杂度为
O ( ( N + Q ) l o g ( m a x ( l [ i ] ) l o g ( m a x ( a [ i ] ) ) O((N+Q)log(max(l[i])log(max(a[i])) O((N+Q)log(max(l[i])log(max(a[i])),实际上由于常数很小加上大多数运算公约数有一边都是0,过时限是绰绰有余的。
具体见代码:

代码样例(已作防抄袭处理):

#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5,M=2e5+5,inf=1e9+7;
#define ull unsigned long long
#define pii pair<int,int>
int n,m,Q,T;
int h[N],to[N<<1],nex[N<<1],lo[N<<1],idx;
ull d[N<<1],ans[M];
bool vis[N];
struct seg{
    int l,r;
    ull v=0;
}tr[M<<2];
vector<pii> q[N];
inline ull gcd(ull a,ull b)//辗转相除求最大公约数
{
    if(a<b)swap(a,b);
    return b==0?a:gcd(b,a%b);
}
inline void add(int x,int y,int a,int b)//加边注意long long
{
    to[idx]=y,nex[idx]=h[x],lo[idx]=a,d[idx]=b,h[x]=idx++;
}
inline void build(int u,int l,int r){
    tr[u]={l,r};
    if(l==r)return;
    int mid=l+r>>1;
    build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
inline void pushup(int u){
    tr[u].v=gcd(tr[u<<1].v,tr[u<<1|1].v);
}
inline ull query(int x,int y,int u){
    if(tr[u].l>=x&&tr[u].r<=y)return tr[u].v;
    int mid=tr[u].l+tr[u].r>>1;
    ull ls=0,rs=0;
    if(mid>=x)ls=query(x,y,u<<1);
    if(mid<y)rs=query(x,y,u<<1|1);
    if(ls&&rs)return gcd(ls,rs);//避免有一个是0返回0
    return ls+rs;
}
inline void update(int p,int u,ull v){
    if(tr[u].l==tr[u].r){
        tr[u].v=v;
        return;
        }
    int mid=tr[u].l+tr[u].r>>1;
    if(mid>=p)update(p,u<<1,v);
    else update(p,u<<1|1,v);
    pushup(u);
}
inline void dfs(int p){
    vis[p]=true;
    for(auto x:q[p]){
        int id=x.first,w=x.second;
        ans[id]=query(1,w,1);
    }
    for(int i=h[p];~i;i=nex[i]){
        int j=to[i];
        if(vis[j])continue;
        update(lo[i],1,d[i]);//更新
        dfs(j);
        update(lo[i],1,0);//回复状态
    }
}
inline void solve(int ca){
    scanf("%d%d",&n,&Q);
    memset(h,-1,sizeof h);
    memset(vis,0,sizeof vis);//初始化
    idx=0,m=0;
    for(int i=1;i<n;i++){
        int x,y,a;
        ull b;
        scanf("%d%d%d%lld",&x,&y,&a,&b);
        add(x,y,a,b);
        add(y,x,a,b);
        m=max(m,a);
    }
    for(int i=1;i<=Q;i++){
        int c,w;
        scanf("%d%d",&c,&w);
        q[c].push_back(make_pair(i,w));
    }
    dfs(1);
    printf("Case #%d: ",ca);
    for(int i=1;i<=Q;i++)printf("%lld ",ans[i]);
    puts("");
}
int main(){
    scanf("%d",&T);
    build(1,1,2e5);
    for(int i=1;i<=T;i++){
        solve(i);
    }
}

本题作为本轮压轴题,思路还是比较明显的,代码虽然看起来不算短,但其实都是套的。不过,kickstart本来也算很水的比赛,本题已经算是有一定难度的了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态卡车-无人机路径规划问题是指在计划交付和即时需求的情况下,如何有效安排卡车和无人机的路径以完成交付任务。 在这个问题中,动态卡车-无人机路径规划需要考虑到多个因素。首先,需要根据交付任务的性质和需求类型确定使用卡车还是无人机。根据交付任务的时间要求和优先级,可以将任务分配给卡车或无人机,以最大程度地提高交付效率。 其次,需要根据交付点的位置和距离进行路径规划。通过算法和模型,可以确定卡车和无人机之间的最佳配送路径,以最小化总体成本和交付时间。这可能包括选择最短路径、减少交通堵塞和选择合适的送货点等策略。 然后,需要考虑资源利用效率。可以通过优化装载和卸载过程,使卡车和无人机的载重能力最大化,以减少行程次数和成本。同时,还可以考虑车辆和无人机的能源消耗,通过合理规划路线和使用动态调度算法来降低能源消耗。 最后,需要考虑实时任务调度和监控。根据任务和道路状况的实时变化,可以动态调整路径和分配任务,以适应不同的需求和情况。同时,应建立有效的监控系统,实时追踪卡车和无人机的位置和交付进度,以及解决可能出现的问题和异常情况。 综上所述,动态卡车-无人机路径规划问题是一个复杂的优化问题,在解决过程中需要考虑到任务类型、路径规划、资源利用效率和实时调度等关键因素,以提高交付效率和降低成本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值