森林岔路91%_森林的指路牌

森林岔路91%_森林的指路牌原题链接森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过C​i​​ 公斤。公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S​j​​ 号城市运输到T​j​​ 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原题链接

森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过C
​i
​​ 公斤。

公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S
​j
​​ 号城市运输到T
​j
​​ 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中途卸货。

为了让公司整体效益更佳,森森想知道如何安排订单的运输,能使得运输的货物重量最大且符合道路的限制?要注意的是,发货时间有可能是任何时刻,所以我们安排订单的时候,必须保证共用同一条道路的所有货车的总重量不超载。例如我们安排1号城市到4号城市以及2号城市到4号城市两张订单的运输,则这两张订单的运输同时受2-3以及3-4两条道路的限制,因为两张订单的货物可能会同时在这些道路上运输。

输入格式:
输入在第一行给出两个正整数N和Q(2≤N≤10
​5
​​ , 1≤Q≤10
​5
​​ ),表示总共的城市数以及订单数量。

第二行给出(N−1)个数,顺次表示相邻两城市间的道路允许的最大运货重量C
​i
​​ (i=0,⋯,N−2)。题目保证每个C
​i
​​ 是不超过2
​31
​​ 的非负整数。

接下来Q行,每行给出一张订单的起始及终止运输城市编号。题目保证所有编号合法,并且不存在起点和终点重合的情况。

输出格式:
在一行中输出可运输货物的最大重量。

输入样例:

10 6
0 7 8 5 2 3 1 9 10
0 9
1 8
2 7
6 3
4 5
4 2

输出样例:

7

样例提示:我们选择执行最后两张订单,即把5公斤货从城市4运到城市2,并且把2公斤货从城市4运到城市5,就可以得到最大运输量7公斤。

题解
由题意可知道,应该先选择最小且在最左边的区间,然后查看区间的最小值,然后讲区间整体减去最小值即可

#include<bits/stdc++.h>
#define x first
#define y second
#define send string::npos
#define lowbit(x) (x&(-x))
#define left(x) x<<1
#define right(x) x<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef struct Node * pnode;
const int N = 2e5 + 10;
const int M = 3 * N;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int Mod = 1e9;
struct { 
   
    int l,r;
    ll v;
    ll add;
}tr[4 * N];
ll a[N];
vector<PII>p;
void push_up(int u){ 
   
    tr[u].v = min(tr[left(u)].v + tr[left(u)].add,tr[right(u)].v + tr[right(u)].add);
}
void push_down(int u){ 
   
    if(tr[u].add){ 
   
        tr[u].v += tr[u].add;
        tr[left(u)].add += tr[u].add;
        tr[right(u)].add += tr[u].add;
        tr[u].add = 0;
    }
}
void build(int l,int r,int u){ 
   
    if(l == r)tr[u] = { 
   l,r,a[l],0};
    else{ 
   
        tr[u] = { 
   l,r,0,0};
        int mid = (l + r) >> 1;
        build(l,mid,left(u));
        build(mid + 1,r,right(u));
        push_up(u);
    }
}
void modify(int l,int r,ll x,int u){ 
   
    if(tr[u].l >= l && tr[u].r <= r)tr[u].add += x;
    else { 
   
        push_down(u);   //修改的时候也必须push_down
        int mid = (tr[u].l + tr[u].r) >> 1;
        if(l <= mid)modify(l,r,x,left(u));
        if(r > mid)modify(l,r,x,right(u));
        push_up(u);
    }
}
ll query(int l,int r,int u){ 
   
    if(tr[u].l >= l && tr[u].r <= r)return tr[u].v + tr[u].add;
    else{ 
   
        push_down(u);
        ll v = LINF;
        int mid = (tr[u].l + tr[u].r) >> 1;
        if(l <= mid)v = query(l,r,left(u));
        if(r > mid)v = min(v,query(l,r,right(u)));
        push_up(u);
        return v;
    }
}
bool cmp(const PII &a,const PII &b){ 
   
    if(a.y != b.y)return a.y < b.y;
    else return a.x < b.x;
}
int main(){ 
   
    int n,m,x,y;
    cin>>n>>m;
    for(int i = 0;i < n - 1;i ++)cin>>a[i];
    build(0,n - 2,1);
    for(int i = 0;i < m;i ++){ 
   
        cin>>x>>y;
        if(x > y)swap(x,y);
        p.push_back({ 
   x,y});
    }
    sort(p.begin(),p.end(),cmp);        //贪心
    ll res = 0;
    for(int i = 0;i < p.size();i ++){ 
   
        ll m = query(p[i].x,p[i].y - 1,1);
        modify(p[i].x,p[i].y - 1,-m,1);
        res += m;
    }
    printf("%lld\n",res);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168910.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月8日 下午9:16
下一篇 2022年8月8日 下午9:16


相关推荐

  • 敏捷开发(scrum)简介

    敏捷开发(scrum)简介敏捷开发 scrum 是一种软件开发的流程 强调快速反应 快速迭代 价值驱动 Scrum 的英文意思是橄榄球运动的一个专业术语 表示 争球 的动作 运用该流程 你就能看到你团队高效的工作 一 四大价值观 特点 敏捷开发的特点就是下面 4 句话 个体与交互 胜过 过程与工具 可以工作的软件 胜过 面面俱到的文挡 客户协作 胜过 合同谈判 响应变化 胜过 遵循计划 说明 1 敏捷开发 scrum 适用于竞争激烈 快速变化的市场 敏捷的客户协作观念 快速迭代能帮助团队以最小成本 最快速

    2026年3月18日
    2
  • 这次一定弄懂完全图、连通图、连通分量、强连通图、强连通分量、极大连通分量、极小联通分量、生成树、生成森林的区别

    这次一定弄懂完全图、连通图、连通分量、强连通图、强连通分量、极大连通分量、极小联通分量、生成树、生成森林的区别一 各个概念的定义 1 完全图 nbsp 也称简单完全图 假设一个图有 n 个顶点 那么如果任意两个顶点之间都有边的话 该图就称为完全图 2 连通图 一般都是指无向图 nbsp 从顶点 v 到 w 有路径 就称顶点 v 和 m 连通 路径是由顶点和相邻顶点序偶构成的边所形成的序列 其实就是一堆相连的顶点及其边 nbsp 如果图中任意俩顶点都连通 则该图为连通图 3 连通分量 nbsp 与连通图对应 一般书上说的都是特指无向图 nbsp 极大连通子图是无向图的连通分量 暗指极大连通子图也指无向

    2026年3月26日
    3
  • 隶属度函数绘制

    隶属度函数绘制建立 pi 型隶属度函数 1 x 1 0 1 10 y pimf x 14510 plot x y xlabel 函数输入值 ylabel 函数输出值 grinon2 建立双边高斯型隶属度函数 gauss2mfx 0 0 1 10 y1 gauss2mf x 2418 4 和 8 是最高值 2 和 1 是宽度 2 是左边的宽度 1 是右边的宽度 y2 gauss2mf x 251

    2026年3月18日
    2
  • oracle 游标 重复记录,oracle 游标循环

    oracle 游标 重复记录,oracle 游标循环Oracle 基础游标原文 Oracle 基础游标一 游标游标用来处理从数据库中检索的多行记录 使用 SELECT 语句 利用游标 程序可以逐个地处理和遍历一次检索返回的整个记录集 为了处理 SQL 语句 Oracle 将在内存中分配一个区域 这就是上下文区 这个区包含了已经处理完的行数 指向被分析语句 文章杰克 陈 2015 01 07841 浏览量 PL SQL 学习笔记 02 游标在 PL SQL 程序

    2026年3月18日
    1
  • springmvc的工作流程

    springmvc的工作流程1、springmvc工作原理图2、springmvc工作流程1、用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controlle

    2022年6月4日
    27
  • tasklist 结束进程_使用 TASKLIST 命令查看 windows 当前运行进程

    tasklist 结束进程_使用 TASKLIST 命令查看 windows 当前运行进程执行TASKLIST/FOCSV/FI”IMAGENAMEeqEXCEL.EXE”/FI”STATUSeqRUNNING”/NH命令,查找正在运行的EXCEL进程,返回CSV格式,并且不显示标题行,返回结果如下:”EXCEL.EXE”,”4840″,”Console”,”1″,”80,936K”TASKLIST使用说明如下:C:\Users\abc>TAS…

    2022年5月20日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号