POJ 3145 Harmony Forever

本文介绍了一种在特定数据范围内优化模查询的方法,并结合线段树进行高效处理。通过对不同模数的分类讨论,实现了对序列中模x最小数的有效查找,特别适用于编程竞赛中的快速实现。

题意:给出”A x”&”B y”两种操作,前者表示查询数列中模x最小的数,如果相等的话,那么输出最近那个数进入数列的顺序

  这样的操作容易想到线段树,但会发现建树时不知道怎么具体建树,可以充分利用一下数据范围,对于每个数都建立一个节点,然后直接做就好了,最重要的就是查询时, 对于1~mod-1, mod~2*mod-1, ……这样的一个一个查询,但是容易发现当模数很小的时候,这样会常数很大,不如直接暴力
还有就是要注意不要手写max, min我手写一直TLE但是用了max,min后就900ms好像也不算慢了,还有存在”-1”的情况

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 5e5 + 10;
#define rep(i, s, t) for(int i = s; i <= t; ++i)
#define dec(i, s, t) for(int i = s; i >= t; --i)

int n, a[N], id[N], top;
struct Bf {
    int query(int Mod) {
        int Res = 0, Mo = N;
        dec(i, top, 1) {
            if(Mo > (a[i]%Mod)) Res = a[i], Mo = a[i] % Mod;
            if(!Mo) break;
        }return Res?id[Res]:-1;
    }
}B;

struct Ser {
    int Min[N<<2];

    void update(int h, int pos, int l, int r) {
        Min[h] = min(Min[h], pos);
        if(l == r) return ;

        int Mid = (l+r) >> 1;
        if(pos <= Mid) update(h<<1, pos, l, Mid);
        else update(h<<1|1, pos, Mid+1, r);
    }

    int query(int h, int ql, int qr, int l, int r) {
        if((ql <= l && r <= qr) || Min[h]>=N) return Min[h];

        int Mid = (l+r) >> 1, Ret = N;
        if(ql <= Mid) Ret = min(Ret, query(h<<1, ql, qr, l, Mid));
        if(Ret < N) return Ret;
        if(qr > Mid) Ret = min(Ret, query(h<<1|1, ql, qr, Mid+1, r));

        return Ret;
    }
}S; 

void Q(int Mod, int Max) {
    if(Mod < 4000) printf("%d\n", B.query(Mod));
    else {
        int t, Ret = 0, Mo = N<<1;
        for(int i = 0; i*Mod <= N; ++i) {
            int st = max(i*Mod, 1);
            int ed = min((i+1)*Mod-1, N);

            t = S.query(1, st, ed, 1, N);
            if(t >= N) continue;
            if((t%Mod) < Mo) Mo = t % Mod, Ret = t;
            else if((t%Mod)== Mo && id[Ret] < id[t]) Ret = t;
        }
        printf("%d\n", Ret?id[Ret]:-1);
    }
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.in", "r", stdin);
    freopen("res.out", "w", stdout);
#endif  
    int T = 0, d; char s[3];
    while(scanf("%d", &n), n) {
        int Max = 0; top = 0;
        if(T) puts("");
        printf("Case %d:\n", ++T);
        rep(i, 0, N-1) id[i] = 0;
        rep(i, 0, (N<<2)-1) S.Min[i] = N;
        rep(i, 1, n) {
            scanf("%s%d", s, &d);
            if(s[0] == 'A') Q(d, Max);
            else {
                Max = max(Max, d);
                a[++top] = d;
                id[d] = top;
                S.update(1, d, 1, N);
            }
        }
    }
    return 0;
}
内容概要:本文系统阐述了智能物流路径规划的技术体系与实践应用,涵盖其发展背景、核心问题建模、关键算法、多目标与动态环境处理、系统架构及典型应用场景。文章以车辆路径问题(VRP)及其变体为核心数学模型,介绍了从Dijkstra、A*等单智能体算法到多车VRP的元启发式求解方法(如遗传算法、蚁群算法、大规模邻域搜索),并深入探讨了多目标优化(成本、时间、碳排放)与动态环境(实时订单、交通变化)下的自适应规划策略。结合城市配送、干线运输、场内物流等案例,展示了路径规划在提升效率、降低成本方面的实际价值,并分析了当前面临的复杂性、不确定性等挑战,展望了AI融合、数字孪生、车路协同等未来趋势。; 适合人群:具备一定物流、运筹学或计算机基础,从事智能交通、物流调度、算法研发等相关工作的技术人员与管理人员,工作年限1-5年为宜。; 使用场景及目标:①理解智能物流路径规划的整体技术架构与核心算法原理;②掌握VRP建模方法与多目标、动态环境下路径优化的实现策略;③为物流系统设计、算法选型与系统优化提供理论依据与实践参考; 阅读建议:建议结合文中案例与数学模型,重点理解算法选择与实际业务场景的匹配逻辑,关注动态规划与多目标优化的工程实现难点,可配合仿真工具或开源求解器进行实践验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值