Codeforces 853B Jury Meeting (差分+前缀和)
<题目链接>
题目大意:
有$ n(n<=1e5)$个城市和一个首都(0号城市),现在每个城市有一个人,总共有$ m (m<=1e5)$次航班,每个航班要么从首都起飞,要么飞到首都去。每个飞机当天飞当天到。且坐飞机这一天什么也不能干,只能等飞机。每个飞机有一个花费和起飞时间。现在要把所有人集中到首都$ k(k<=1e6) $天,然后让他们各自回家。求最小花费,如果不可能实现k天或者不能回家了。或者去不了首都等等都输出-1。
解题分析:
首先判断是否有至少长度为k的区间能够保证所有人能够来,并且回去。之后再利用差分、前缀和维护一定区间内所有人能够出发和到达的最小花费。
#include <bits/stdc++.h>
using namespace std; #define pb push_back
#define mp make_pair
#define fi first
#define se second
const int N = 1e6+;
typedef long long ll;
typedef pair<int,int> paii;
vector<paii> G[N],G1[N];
const ll INF = 1e15;
ll preday[N],lastday[N];
int n,m,k; bool cmp1(paii a,paii b){ return a.fi==b.fi?(a.se<b.se):(a.fi<b.fi); }
bool cmp2(paii a,paii b){ return a.fi==b.fi?(a.se<b.se):(a.fi>b.fi); } //优先回来时间晚,花费少的航班 int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++){
int day,u,v,cost;scanf("%d%d%d%d",&day,&u,&v,&cost);
if(!v)G[u].pb(mp(day,cost)); //每个人出发的航班
if(!u)G1[v].pb(mp(day,cost)); //每个人回来的航班
}
int l=-,r=1e9; //记录能够让所有人聚集在一起的最大区间长度
for(int i=;i<=n;i++){
sort(G[i].begin(),G[i].end(),cmp1);
sort(G1[i].begin(),G1[i].end(),cmp2);
if(G[i].size())l=max(l,G[i][].fi+);
if(G1[i].size())r=min(G1[i][].fi-,r);
if(G[i].size()== || G1[i].size()==)return *puts("-1"); //如果这个人不能出发或者回来
}
if(r-l+<k || l==- || r==1e9)return *puts("-1");
for(int i=;i<=n;i++){
ll now=INF;
preday[]+=now;
for(int j=;j<G[i].size();j++){ //从出发时间早的方案开始遍历。前缀求和之后,相当于只保留了(最早)的(最便宜)的方案的值
if(G[i][j].se<now){
preday[G[i][j].fi]-=now;
preday[G[i][j].fi]+=G[i][j].se;
now=G[i][j].se;
}
}//这里如果求前缀的话,sum_preday[day]就相当于得到第i个人在1~day天内出发所花费的最少钱数
now=INF;
lastday[int(1e6)]+=now;
for(int j=;j<G1[i].size();j++){
if(G1[i][j].se<now){
lastday[G1[i][j].fi]-=now;
lastday[G1[i][j].fi]+=G1[i][j].se;
now=G1[i][j].se;
}
}//这里如果求后缀,sum_lastday[day]就相当于得到第i个人day~1e6天内回来所花费的最少钱数
}
//计算1~n次之后,sum_preday[day]就表示n个人,在1~day天能够出发的最少钱数(如果他在day天之前能够出发的话,不能出发的话,他的前缀花费为INF)
//后缀sum_lastday[day]同理
for(int i=;i<=int(1e6);i++)preday[i]+=preday[i-]; //计算前缀
for(int i=int(1e6);i>=;i--)lastday[i]+=lastday[i+]; //计算后缀
ll ans=INF;
for(int i=l;i+k-<=r;i++)
ans=min(ans,preday[i-]+lastday[i+k]);
printf("%lld\n",ans);
}
2019-03-02
Codeforces 853B Jury Meeting (差分+前缀和)的更多相关文章
- codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)
题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费? 用数组arr1[i]记录在第i天人到齐的最小花费.arr2[i]记录第i天之后才有人开始走的最小花费.然后取a ...
- Codeforces 853B Jury Meeting
题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ...
- Educational Codeforces Round 61 C 枚举 + 差分前缀和
https://codeforces.com/contest/1132/problem/C 枚举 + 差分前缀和 题意 有一段[1,n]的线段,有q个区间,选择其中q-2个区间,使得覆盖线段上的点最多 ...
- Jury Meeting CodeForces - 854D
Jury Meeting CodeForces - 854D 思路:暴力枚举会议开始的那一天(只需用所有向0点飞的航班的那一天+1去枚举即可),并计算所有人此情况下去0点和从0点出来的最小花费. 具体 ...
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D. Jury Meeting(双指针模拟)
D. Jury Meeting time limit per test 1 second memory limit per test 512 megabytes input standard inpu ...
- HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】
理工门外的树 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %lld , %llu Java class n ...
- HDU 5419——Victor and Toys——————【线段树|差分前缀和】
Victor and Toys Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others ...
- HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】
Minimum Cut Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...
随机推荐
- 来,了解一下Java内存模型(JMM)
网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...
- Confluence 6 索引支持的语言并进行修改
Confluence 中索引的语言配置. 可以单击编辑后进行修改. https://www.cwiki.us/display/CONF6ZH/Configuring+Indexing+Language
- Confluence 6 创建一个主题
如果你希望创建你自己的主题,你需要写一个 Confluence 插件.请参考我们开发文档中的下面页面 开始使用 插件开发. 请参考开发者指南的页面来 写一个 Confluence 主题. 使用 主题插 ...
- Java的动手动脑(六)
日期:2018.11.8 星期四 博客期:022 --------------------------------------------------------------------------- ...
- 【python】正则替换
正则替换可以使用函数 例如:替换字符串中所有#1.2.3.4#格式中的数字为0 import re def replace(x): def _replace(matched): m = matched ...
- Nginx详解十五:Nginx场景实践篇之负载均衡
负载均衡 GSLB(全局的负载均衡,往往是以国家为单位,或者以省为单位) SLB Nginx就是一个典型的SLB模型, 分为四层负载均衡和七层负载均衡 七层负载均衡可以处理应用层,如thhp信息,Ng ...
- Nginx详解十一:Nginx场景实践篇之Nginx缓存
浏览器缓存: HTTP协议定义的缓存机制(如:Expires.Cache-control等) 当浏览器第一次请求的时候,浏览器是没有缓存的 第二次请求开始就有缓存了 校验过期机制 配置语法-expir ...
- vue用webpack打包时引入es2015插件
1.安装依赖包 $ npm install --save-div babel-preset-es2015 ps:babel-loader.babel-core应该是默认装好的,如果没有安装,请重新安装 ...
- UIDebuggingInformationOverlay 调试
https://archimboldi.me/posts/%E7%BF%BB%E8%AF%91-uidebugginginformationoverlay.html http://ryanipete. ...
- windows10的文件浏览器中无法搜索文件内容
系统:更新到最新的win10(2018年8月23日 23:54:31) 重现步骤:git clone一个项目,然后切换到它的另一个分支:打开文件夹浏览器(explorer),在右上角里输入想要查找的字 ...