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)的和. 好难,不会写. ...
随机推荐
- Day16--Python--初识面向对象
今日主要内容一. 面向对象思想 1. 面向过程. 重点在'过程'. 按照事物迭代发展流程. 优点: 简单,流水线式的操作 缺点: 可扩展性差.可维护性差. 2. 面向对象. 对象是属性和动作的集合体. ...
- Git学习笔记——搭建远程仓库
有空再把笔记移上来 注意点:git remote add origin不是相对于所有git仓库,只相对于当前git仓库 心得:远程建立裸仓库,意味着我不应该直接操作远程仓库.如果我是管理员,我应该先p ...
- codeforces 540E"Infinite Inversions"
传送门 题意: 给你一个无限大的整数序列 p = {1, 2, 3, ...}: 有 n 次操作,每次操作交换第 ai 个数和第 aj 个数: 求序列中逆序对的个数: 题解: 考虑交换完后的序列,存 ...
- Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)
Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...
- Luogu P1251 餐巾计划问题
题目链接 \(Click\) \(Here\) 看到其他人都是用费用流写的,我只能表示:动什么脑子?暴力就完事了! 嗯,这个题应该是一个相当显然的上下界最小费用可行流模型,所以跑就完事了. \(s - ...
- (数字三角形)POJ1163 The Triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59698 Accepted: 35792 De ...
- Mysql+Keepalived双主热备高可用操作记录
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...
- lucene的普通搜索(二)
首先得到索引: package com.wp.util; import java.io.File; import java.io.FileReader; import java.nio.file.Pa ...
- Tensorflow object detection API 搭建物体识别模型(四)
四.模型测试 1)下载文件 在已经阅读并且实践过前3篇文章的情况下,读者会有一些文件夹.因为每个读者的实际操作不同,则文件夹中的内容不同.为了保持本篇文章的独立性,制作了可以独立运行的文件夹目标检测. ...
- awk 处理文本:行转列,列转行
[root@centos ~]# cat f 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 51 2 3 4 5 awk '{for(i=1;i<=NF;i++)a ...