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 ...
随机推荐
- NHibernate 如何在并行线程下,使用session
第一,你要知道,并行线程会有一个蛋疼的地方.他不会每次执行都给你去开一个线程. 我一开始以为每次执行都会去开一个新的线程.... list.AsParallel().ForAll(memberInfo ...
- NIO(三)
使用直接缓冲区完成文件的复制(内存映射文件) package com.cppdy.nio; import java.nio.MappedByteBuffer; import java.nio.chan ...
- GIL锁
GIL锁 在CPython中,这个全局解释器锁,也称 ...
- Es6对象的扩展和Class类的基础知识笔记
/*---------------------对象的扩展---------------------*/ //属性简写 ,属性名为变量名, 属性值为变量的值 export default functio ...
- css样式之属性操作
一.文本属性 1.text-align:cnter 文本居中 2.line heigth 垂直居中 :行高,和高度对应 3.设置图片与文本的距离:vertical-align 4.text-decor ...
- k倍区间
看大佬的代码看了半天,终于算是懂了 标题: k倍区间 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就 ...
- jsp 标签文件
一. tag file 简介 tag file从两个方面简化了自定义标签的开发.首 先,tag file无须提前编译,直到第一次被调用才会编 译.除此之外,仅仅使用JSP语法就可以完成标签的扩 展定义 ...
- cf自训6
cf946D 背包+区间dp 好题 /* 先预处理出每行消去i个1后可以的到的最小时间: 先求每行的前缀和,枚举左端点和右端点,消去的1 cost=tot-sum[r]+sum[l-1],区间长度=r ...
- Allegro PCB Design GXL (legacy) 从dxf文件中导入板框
Allegro PCB Design GXL (legacy) version 16.6-2015 新建brd文件,并设置好相应的参数之后,点击菜单:File > Import > DXF ...
- spring cloud feign覆写默认配置级feign client的日志打印
一.覆写fegin的默认配置 1.新增配置类FeignConfiguration.java package com.config; import org.springframework.context ...