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)的和. 好难,不会写. ...
随机推荐
- mybatis 直接执行sql 【我】
Connection conn = getConnection();// Connection conn = this.ss.getConnection(); 返回Connect ...
- Ubuntu: Windows Help Tools For Ubuntu
Virtual Box https://www.virtualbox.org/wiki/Linux_Downloads 装不上Wine时直接装虚拟机吧.RTX真是个坑爹的东西,找不到替代的客户端 迅雷 ...
- 安装SDL遇到的问题
版本:SDL-1.2.15 转自,遇到的问题与此一样:http://blog.csdn.net/huierlc/article/details/50165237 问题1:make时出现 fatal e ...
- java eclipse 安卓环境配置
adt下载地址 http://www.runoob.com/w3cnote/android-tutorial-eclipse-adt-sdk-app.html 我的云 安卓学习 java htt ...
- 如何在Mac上安全彻底的卸载软件?
文章来源:知乎 收录于:风云社区(SCOEE)[提供mac软件下载] 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 SCOEE],查找和下载相关软件资源. (一)综合类: 新买 ...
- python3.x 和pip3的安装
python3.x 和pip3的安装 本人在学习python3的时候,视频中使用的是python3,在讲解到有些第三方库的时候,无法使用到pip3 install来安装所需的库.由于系统是centos ...
- CodeForces7D 字符串hash + dp
https://cn.vjudge.net/problem/20907/origin 长度是 n 的字符串 s,如果它自身是回文数,且它的长度为 的前缀和后缀是 (k - )-回文数,则它被称作 k- ...
- 网络设备监控-Catic添加H3C的监控图解
网络设备监控-Catic添加H3C的监控图解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 首先,我要声明满足2个条件才能作本篇笔记的操作:第一:你得有台cacti服务器,第二 ...
- JAVA-Enum 枚举
[参考]枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开. 说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有. 正例:枚举名字为 ProcessSta ...
- Web API中的消息处理程序(Message Handler)
一.消息处理程序的概念 信息处理程序(Message Handler)接收HTTP请求并返回一个HTTP响应的类.Message Handler继承 HttpMessageHandler 类. 通常, ...