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

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

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

输入格式:

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

第二行给出(个数,顺次表示相邻两城市间的道路允许的最大运货重量C​i​​(,)。题目保证每个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公斤。

题意,给出一些区间,这些区间的最大值是所有小区间取最小,问怎么选择区间可以使取值最大。

参照大神的做法,首先给区间进行排序,按照右端点升序排序,相同的左端点升序,可以从左往右排开,

然后考虑两个相邻区间取组大值问题,如果两个区间是一个被另一个包含,显然大的取值受小的取值限制,也就是说选择小区间最优,比如一个区间是[2,7],另一个是[3,5],前一个区间所能取得的最大值是min([2,3],[3,4],[4,5],[5,6],[6,7]),而后一个区间是min([3,4],[4,5]),显然后一个区间的约束少,所取值大于等于前一个区间的取值。

如果两个区间是相交的,相交部分为b,那么设左边区间是a和b组成,右边是b和c组成,这个时候怎么判断,关键是看b的取值大小,

如果b最大,这个时候取min(a + c,b)(因为b是公共部分,如果b能承载的了a和c的和,那自然很好,如果不行,就得受b约束),

如果b最小,那不用说两个区间总的最多也就是取值b,如果b大小折中,那自然还是取b,比如是a>b>c,零右边区间取值c,中间段剩下b-c,总的就是b了。

所以综合后两种情况都是a+c>b,相交就取值min(a+c,b),

排序后可以从左往右一个一个求区间最大值,然后更新这个区间都减去这个值,表示后边与这个区间相交的受相交部分影响,所以要更新。

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define inf 0x3f3f3f3f3f
using namespace std;
typedef pair<int,int> pa;
typedef long long ll;
int n,q;
ll ans;
int v[];
pa p[];
int tree[],lazy[];
bool cmp(const pa &a,const pa &b) {
if(a.second == b.second) return a.first < b.first;
return a.second < b.second;
}
void build(int l,int r,int t) {
lazy[t] = ;
if(l == r) tree[t] = v[l];
else {
int mid = (l + r) >> ;
build(l,mid,t << );
build(mid + ,r,t << | );
tree[t] = min(tree[t << ],tree[t << | ]);
}
}
void pushdown(int t) {
if(lazy[t] == ) return;
lazy[t << ] += lazy[t];
lazy[t << | ] += lazy[t];
tree[t << ] -= lazy[t];
tree[t << | ] -= lazy[t];
lazy[t] = ;
}
void update(int l,int r,int t,int L,int R,int d) {
if(l >= L && r <= R) tree[t] -= d,lazy[t] += d;
else {
pushdown(t);
int mid = (l + r) >> ;
if(mid >= L) update(l,mid,t << ,L,R,d);
if(mid < R) update(mid + ,r,t << | ,L,R,d);
tree[t] = min(tree[t << ],tree[t << | ]);
}
}
ll query(int l,int r,int t,int L,int R) {
if(l >= L && r <= R) return tree[t];
if(l > R || r < L) return inf;
int mid = (l + r) >> ;
ll d = inf;
pushdown(t);
if(mid >= L) d = min(d,query(l,mid,t << ,L,R));
if(mid < R) d = min(d,query(mid + ,r,t << | ,L,R));
tree[t] = min(tree[t << ],tree[t << | ]);
return d;
}
int main() {
scanf("%d%d",&n,&q);
for(int i = ;i < n - ;i ++) {
scanf("%d",&v[i]);
}
build(,n - ,);
for(int i = ;i < q;i ++) {
scanf("%d%d",&p[i].first,&p[i].second);
if(p[i].first > p[i].second) swap(p[i].first,p[i].second);
p[i].second --;
}
sort(p,p + q,cmp);
for(int i = ;i < q;i ++) {
ll d = query(,n - ,,p[i].first,p[i].second);
ans += d;
update(,n - ,,p[i].first,p[i].second,d);
}
printf("%lld",ans);
}

L3-017 森森快递 (30 分)的更多相关文章

  1. L3-2 森森快递 (30 分)(贪心+线段树/分块)

    题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798 题目大意: 森森开了一家快递公 ...

  2. PAT L3-017. 森森快递

    L3-017. 森森快递 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 俞勇(上海交通大学) 森森开了一家快递公司,叫森森快递.因为 ...

  3. PTA 07-图5 Saving James Bond - Hard Version (30分)

    07-图5 Saving James Bond - Hard Version   (30分) This time let us consider the situation in the movie ...

  4. PTA 社交网络图中结点的“重要性”计算(30 分)

    7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...

  5. L3-015 球队“食物链” (30 分)

    L3-015 球队“食物链” (30 分)   某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...

  6. PAT A1127 ZigZagging on a Tree (30 分)——二叉树,建树,层序遍历

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

  7. 04-树6 Complete Binary Search Tree(30 分)

    title: 04-树6 Complete Binary Search Tree(30 分) date: 2017-11-12 14:20:46 tags: - 完全二叉树 - 二叉搜索树 categ ...

  8. PTA 7-2 二叉搜索树的结构(30 分)

    7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...

  9. 1127 ZigZagging on a Tree (30 分)

    1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive in ...

随机推荐

  1. ninja install error

    ninja install ...... CMake Error at cmake_install.cmake:36 (FILE):  file INSTALL cannot find  " ...

  2. Java下载https文件上传到阿里云oss服务器

    Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...

  3. codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)

    题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...

  4. Android studio的 repositories配置多个url

    buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...

  5. Andriod给textview文本关键字循环标亮加粗

    在开发中,搜索到得关键字信息在展示时,通常需要标亮加粗,如下图(截取自蓝鲸医生助手搜索后的结果) 在文本中,关键字是“嘎”,所有“嘎”字都标亮加粗,标亮就是换种颜色.这里就要用到SpannableSt ...

  6. Intel DAAL AI加速——神经网络

    # file: neural_net_dense_batch.py #================================================================= ...

  7. BZOJ一天提交(AC) 51纪念

    像我这种蒟蒻...一天交了51道题也要纪念... 真是...但是.不知道还有没有机会了... 这样子就会有很多题解要补了...慢慢来吧... 另.AC数已经超过500了还真是历史性的一步啊...

  8. linux make virtual memory more efficient three components

    Page Cache This is used to speed up access to images and data on disk. As pages are read into memory ...

  9. mysql日期时间类型总结

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较.  日期类型        存储空间       日期格式                 日期范围  ------------ ---- ...

  10. [工作代码]dom4j解析实例

    工作中,我需要和另一个公司(A公司)共同开发一个模块,我写一个servlet接口,A公司携带xml格式的报文来访问.我采用流的形式读取,在处理后以流的形式写入,在返回(相应)给A公司. demo: p ...