L3-2 森森快递 (30 分)(贪心+线段树/分块)
题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798
题目大意:
森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(编号。由于道路限制,第i号城市(,)与第(号城市中间往返的运输货物重量在同一时刻不能超过Ci公斤。
公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从Sj号城市运输到Tj号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中途卸货。
为了让公司整体效益更佳,森森想知道如何安排订单的运输,能使得运输的货物重量最大且符合道路的限制?要注意的是,发货时间有可能是任何时刻,所以我们安排订单的时候,必须保证共用同一条道路的所有货车的总重量不超载。例如我们安排1号城市到4号城市以及2号城市到4号城市两张订单的运输,则这两张订单的运输同时受2-3以及3-4两条道路的限制,因为两张订单的货物可能会同时在这些道路上运输。
具体思路:首先对区间的右端点进行排序,先处理短的区间,再去处理长的区间,这样就能保证是最大了。其实就是区间查询和区间修改。
作死用分块打的区间查询和区间修改,有一个两分的样例就是A不了。。以后这种区间修改还是用线段树吧,,
分块代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const ll inf =0x3f3f3f3f3f3f3f3f;
const int maxn= 3e6+;
ll a[maxn];
struct node
{
ll st;
ll ed;
bool friend operator < (node t1,node t2)
{
return t1.ed<t2.ed;
}
} q[maxn];
ll vis[maxn];
ll belong[maxn];
ll l[maxn],r[maxn];
ll add[maxn];
ll sum[maxn];
ll n,m;
void build()
{
ll block=(ll)sqrt(n-1ll);
for(ll i=; i<n; i++)
belong[i]=i/block+1ll;
ll tot=(n-)/block;
if((n-)%block)
tot++;
for(ll i=; i<=tot; i++)
{
l[i]=(i-)*block+1ll;
r[i]=(i)*block;
}
r[tot]=n-;
for(ll i=; i<=tot; i++)
{
sum[i]=inf;
for(ll j=l[i]; j<=r[i]; j++)
{
sum[i]=min(vis[j],sum[i]);
}
}
}
ll ask(ll st,ll ed)
{
ll ans=inf;
if(belong[st]==belong[ed])
{
for(ll i=st; i<=ed; i++)
{
ans=min(ans,vis[i]+add[belong[st]]);
}
return ans;
}
for(ll i=st; i<=r[belong[st]]; i++)
ans=min(ans,vis[i]+add[belong[st]]);
for(ll i=l[belong[ed]]; i<=ed; i++)
ans=min(ans,vis[i]+add[belong[ed]]);
for(ll i=belong[st]+; i<belong[ed]; i++)
ans=min(ans,sum[i]+add[i]);
return ans;
}
void up(ll st,ll ed,ll val)
{
if(belong[st]==belong[ed])
{
for(ll i=st; i<=ed; i++)
{
vis[i]+=val;
sum[belong[st]]=min(sum[belong[st]],vis[i]);
}
return ;
}
for(ll i=st; i<=r[belong[st]]; i++)
{
vis[i]+=val;
sum[belong[st]]=min(sum[belong[st]],vis[i]);
}
for(ll i=l[belong[ed]]; i<=ed; i++)
{
vis[i]+=val;
sum[belong[ed]]=min(sum[belong[ed]],vis[i]);
}
for(ll i=belong[st]+; i<belong[ed]; i++)
{
add[i]+=val;
}
}
signed main()
{
// cout<<inf<<endl;
scanf("%lld %lld",&n,&m);
for(ll i=; i<n; i++)
scanf("%lld",&vis[i]);
sort(q+,q+m+);
build();
ll st,ed;
for(ll i=; i<=m; i++)
{
scanf("%lld %lld",&q[i].st,&q[i].ed);
q[i].st++;
q[i].ed++;
if (q[i].st > q[i].ed)
swap(q[i].st, q[i].ed);
}
sort(q+,q+m+);
ll sum=;
for(ll i=; i<=m; i++)
{
ll minn;
minn=ask(q[i].st,q[i].ed-);
sum+=minn;
up(q[i].st,q[i].ed-,-minn);
}
printf("%lld\n",sum);
return ;
}
线段树代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define lson l,m,rt<<
# define rson m,r,rt<<|
const ll inf =0x3f3f3f3f3f3f3f;
const int maxn= 3e6+;
struct node
{
ll st;
ll ed;
bool friend operator < (node t1,node t2)
{
return t1.ed<t2.ed;
}
} q[maxn];
ll tree[maxn<<],lazy[maxn<<];
void up(ll rt)
{
tree[rt]=min(tree[rt<<],tree[rt<<|]);
}
void down(int rt)
{
tree[rt<<]+=lazy[rt];
tree[rt<<|]+=lazy[rt];
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
}
void build(ll l,ll r,ll rt)
{
if(l+==r)
{
scanf("%lld",&tree[rt]);
return ;
}
ll m=(l+r)>>;
build(lson);
build(rson);
up(rt);
}
ll ask(ll L,ll R,ll l, ll r,ll rt)
{
if(R<=l||L>=r)
return inf ;
if(L<=l&&R>=r)
{
return tree[rt];
}
ll m=(l+r)>>1ll;
down(rt);
return min(ask(L,R,lson),ask(L,R,rson));
}
void update(ll L,ll R,ll l,ll r,ll rt,ll val)
{
if(R<=l||L>=r)
return ;
if(L<=l&&R>=r)
{
tree[rt]+=val;
lazy[rt]+=val;
return ;
}
ll m=(l+r)>>;
down(rt);
update(L,R,lson,val);
update(L,R,rson,val);
up(rt);
}
int main()
{
ll n,m;
// cout<<inf<<endl;
scanf("%lld %lld",&n,&m);
build(,n,);
ll st,ed;
for(ll i=; i<=m; i++)
{
scanf("%lld %lld",&q[i].st,&q[i].ed);
q[i].st++;
q[i].ed++;
if (q[i].st > q[i].ed)
swap(q[i].st, q[i].ed);
}
sort(q+,q+m+);
ll sum=;
for(ll i=; i<=m; i++)
{
ll minn;
minn=ask(q[i].st,q[i].ed,,n,);
sum+=minn;
update(q[i].st,q[i].ed,,n,,-minn);
}
printf("%lld\n",sum);
return ;
}
L3-2 森森快递 (30 分)(贪心+线段树/分块)的更多相关文章
- BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库
正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)
题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...
- PAT-GPLT L3-017 森森快递(贪心 + 线段树)
链接: https://www.patest.cn/contests/gplt/L3-017 题意: 给出直线上的N个顶点,(N-1)条边的限制值(每对相邻的顶点之间都有一条边),以及Q个区间(给出起 ...
- 2018.09.30 bzoj2288:生日礼物(贪心+线段树)
传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...
- [九省联考2018]IIIDX 贪心 线段树
~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...
- 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)
http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...
- [JZOJ6400]:Game(贪心+线段树+二分)
题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...
- Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)
题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...
随机推荐
- IO处理要注意的事:关闭资源!关闭资源!关闭资源!
案例1: 现象: 同事做本地txt数据切分然后处理,发现删除本地临时文件目录中的文件时,有时成功,有时删除完了发现文件还在.代码各处都不报错,且各种日志打印正常. 解决: 最后发现,是业务逻辑代码中有 ...
- JQERY EasyUI Tabs 选项卡 自适应浏览器宽度高度 解决方案
<script type="text/javascript"> $(window).resize(function () { $('#tt').tabs({ width ...
- Go-day05
今日概要: 1. 结构体和方法 2. 接口 一.go中的struct 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 ...
- Memcached入门学习
Memcached入门学习 学习网址:http://www.runoob.com/Memcached/Memcached-tutorial.html
- Kafka技术内幕 读书笔记之(六) 存储层——日志的读写
-Kafka是一个分布式的( distributed ).分区的( partitioned ).复制的( replicated )提交日志( commitlog )服务 . “分布式”是所有分布式系统 ...
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardSalDao' defined in file [E:\GItUp\pointerCard+redis\target\gameCard-1.0-SNAPSHOT\WEB-INF\classes\cn\jbit\dao
错误信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardSa ...
- 【1】【leetcode-77】 组合
(典型,做过似曾相识但不熟悉,基本知道怎么做但调试了一个多小时各种错) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: ...
- 064、Weave网络结构分析(2019-04-04 周四)
参考https://www.cnblogs.com/CloudMan6/p/7482035.html Weave网络使用之前需要执行 eval $(weave env) ,其作用是将后续的doc ...
- HttpService
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...
- IDAPython学习(二)
1.常用函数 ScreenEA() 获取IDA调试窗口中,光标指向代码的地址.通过这个函数,我们就能够从一个已知的点运行我们的脚本. GetInputFileMD5() 返回IDA加载的二进制文件的M ...