<题目链接>

题目大意:

有$ 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 (差分+前缀和)的更多相关文章

  1. codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)

    题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费? 用数组arr1[i]记录在第i天人到齐的最小花费.arr2[i]记录第i天之后才有人开始走的最小花费.然后取a ...

  2. Codeforces 853B Jury Meeting

    题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ...

  3. Educational Codeforces Round 61 C 枚举 + 差分前缀和

    https://codeforces.com/contest/1132/problem/C 枚举 + 差分前缀和 题意 有一段[1,n]的线段,有q个区间,选择其中q-2个区间,使得覆盖线段上的点最多 ...

  4. Jury Meeting CodeForces - 854D

    Jury Meeting CodeForces - 854D 思路:暴力枚举会议开始的那一天(只需用所有向0点飞的航班的那一天+1去枚举即可),并计算所有人此情况下去0点和从0点出来的最小花费. 具体 ...

  5. 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 ...

  6. HRBUST 1909——理工门外的树——————【离线处理,差分前缀和】

    理工门外的树 Time Limit: 1000 MS Memory Limit: 32768 KB 64-bit integer IO format: %lld , %llu Java class n ...

  7. HDU 5419——Victor and Toys——————【线段树|差分前缀和】

    Victor and Toys Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others ...

  8. HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】

    Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Tota ...

  9. 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...

随机推荐

  1. JAVA覆写Request过滤XSS跨站脚本攻击

    注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. ...

  2. Confluence 6 查看系统属性

    当你添加了内存,设置了代理(proxy)或者修改了 Java 的选项,通常比较难判断系统是否已经按照你的修改进行了配置和启动.这个页面将会帮助你查看 Confluence 站点运行使用的系统属性. 你 ...

  3. iOS 运行时使用(交换两个方法)

    举例 在创建了如下代码 NSString *str=nil; NSURL *url =[NSURL URLWithString:str]; NSLog(@"%@",url); 但是 ...

  4. usrp-B210

    sudo add-apt-repository ppa:ettusresearch/uhd sudo apt-get update sudo apt-get install libuhd-dev li ...

  5. 最短路径之Bellman-Ford算法

    第一行为源点个数,边的个数m 接下来m行为a->b和权值 5 52 3 21 2 -31 5 54 5 23 4 3 Bellman-Ford算法(1): #include<iostrea ...

  6. 【python】打印函数调用栈

    traceback.print_stack()

  7. 爬虫----模拟用户登录gitHub

    #第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码 data={ 'commit':'Sign in', 'utf8':'✓', 'authenticity_tok ...

  8. Java Insets获取窗口的顶、底、左、右的大小

    import java.awt.Insets; import javax.swing.JFrame; public class NewFrame { public static void main(S ...

  9. JS实现继承的几种方式(转)

    转自:幻天芒的博客 前言 JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如 ...

  10. easyui实现背景图片半透明状态,悬浮在大背景之上

    首先是查找素材,使用AI将所需要的图案画出来,切记将图案的背景设置为所需要的透明状态.项目使用的是easyui架构 为啥加两个背景图呢,因为这样的布局最开始是给一个矩形框加上的背景图片,若是还使用矩形 ...