题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798

题目大意:

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

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

为了让公司整体效益更佳,森森想知道如何安排订单的运输,能使得运输的货物重量最大且符合道路的限制?要注意的是,发货时间有可能是任何时刻,所以我们安排订单的时候,必须保证共用同一条道路的所有货车的总重量不超载。例如我们安排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 分)(贪心+线段树/分块)的更多相关文章

  1. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  2. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  3. 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)

    题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...

  4. PAT-GPLT L3-017 森森快递(贪心 + 线段树)

    链接: https://www.patest.cn/contests/gplt/L3-017 题意: 给出直线上的N个顶点,(N-1)条边的限制值(每对相邻的顶点之间都有一条边),以及Q个区间(给出起 ...

  5. 2018.09.30 bzoj2288:生日礼物(贪心+线段树)

    传送门 线段树经典题目. 每次先找到最大子段和来更新答案,然后利用网络流反悔退流的思想把这个最大字段乘-1之后放回去. 代码: #include<bits/stdc++.h> #defin ...

  6. [九省联考2018]IIIDX 贪心 线段树

    ~~~题面~~~ 题解: 一开始翻网上题解看了好久都没看懂,感觉很多人都讲得不太详细,所以导致一些细节的地方看不懂,所以这里就写详细一点吧,如果有不对的or不懂的可以发评论在下面. 首先有一个比较明显 ...

  7. 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)

    http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...

  8. [JZOJ6400]:Game(贪心+线段树+二分)

    题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...

  9. Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)

    题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...

随机推荐

  1. windows 文件夹下所有文件名称

    dir dir /b 没有其它信息 dir /b >>xxx.txt 保存到txt

  2. 斯坦福大学公开课机器学习: advice for applying machine learning | deciding what to try next(revisited)(针对高偏差、高方差问题的解决方法以及隐藏层数的选择)

    针对高偏差.高方差问题的解决方法: 1.解决高方差问题的方案:增大训练样本量.缩小特征量.增大lambda值 2.解决高偏差问题的方案:增大特征量.增加多项式特征(比如x1*x2,x1的平方等等).减 ...

  3. 【非专业前端】使用vue2.5.17+element2.4.5

    开发工具:WebStorm 先搞好环境 可以看出,想安装@vue/cli需要node.js.先去下载安装好. 然后安装@vue/cli npm install -g @vue/clinpm insta ...

  4. Docker下安装Influxdb-1.6.1和Grafana5.2.2

    第一步.安装Influxdb 首先启动docker systemctl start docker 然后安装Influxdb(这里解释一下为啥用docker,因为官网下载的话需要FQ[fan-qiang ...

  5. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  6. python正则提取关键字

    python使用正则表达式提取关键字 import sys reload(sys) sys.setdefaultencoding("utf-8") import re ss = & ...

  7. centos的用户、组权限、添加删除用户等操作的详细操作命令

    1.Linux操作系统是多用户多任务操作系统,包括用户账户和组账户两种 细分用户账户(普通用户账户,超级用户账户)除了用户账户以为还 有组账户所谓组账户就是用户账户的集合,centos组中有两种类型, ...

  8. CentOS 网络设置

    CentOS 网络设置有两种方式配置网络可以连接外网: 自动分配与手动设置Ip 一,自动分配ip: 新装的centos6.0,用ifconfig只显示ifcfg-lo的信息,可以用ifup eth0的 ...

  9. callback hell (回调地狱)

    callback hell (回调地狱) callback(回调) 如何修复 callback hell callback 回调只是存放一些即将要处理的代码. 回调的执行顺序不是从上到下的,而是根据事 ...

  10. nginx 前端POST请求405问题解决与排查过程

    问题描述 在请求时,f12提示POST请求报错405 环境描述 nginx转发至后端nginx,后端nginx转发至后端golang api接口 解决步骤 根据网上方法排查,发现80%以上无非就是以下 ...