题面:

传送门

思路:

看完题目以后,首先有一个结论:每个人都是先去到首都,等待开会,开会结束以后再一个个走掉

而且这道题只有去首都和离开首都的机场

因此考虑计算去首都的飞机的前缀最小花费,以及离开首都的飞机的最小后缀花费

都计算出来以后,对于每一个开始开会的时间t,用pre[t-1]+suf[t+k]来更新答案即可

Code:

到处都要用long long......

最后我只好ctrl+R,替换int为longlong了......

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
const ll inf=1e15;
using namespace std;
inline ll read(){
ll re=,flag=;char ch=getchar();
while(ch>''||ch<''){
if(ch=='-') flag=-;
ch=getchar();
}
while(ch>=''&&ch<='') re=(re<<)+(re<<)+ch-'',ch=getchar();
return re*flag;
}
ll n,m,K,cnta,cntb,cntva,cntvb;
ll pre[],suf[];ll suma,sumb;
bool vis[];ll minn[];
struct flight{
ll to,cost,t;
}a[],b[];
bool cmp(flight l,flight r){
return l.t<r.t;
}
bool cmp2(flight l,flight r){
return l.t>r.t;
}
int main(){
ll i,j,t1,t2,t3,t4;ll ans=inf;
n=read();m=read();K=read();
for(i=;i<=m;i++){
t1=read();t2=read();t3=read();t4=read();
if(t2!=) a[++cnta]=(flight){t2,t4,t1};
else b[++cntb]=(flight){t3,t4,t1};
}
if(cnta<n||cntb<n){
puts("-1");return ;
}
sort(a+,a+cnta+,cmp);sort(b+,b+cntb+,cmp2);
for(i=;i<=n;i++) suma+=(ll)(minn[i]=inf);
t1=;pre[]=inf;
for(i=;i<=cnta;i++){
for(j=t1+;j<a[i].t;j++) pre[j]=pre[j-];
t1=a[i].t;
if(!vis[a[i].to]) vis[a[i].to]=,cntva++;
suma-=minn[a[i].to]-min(minn[a[i].to],a[i].cost);
minn[a[i].to]=min(minn[a[i].to],a[i].cost);
if(cntva==n) pre[t1]=suma;
else pre[t1]=-;
}
memset(vis,,sizeof(vis));
for(i=;i<=n;i++) sumb+=(ll)(minn[i]=inf);
t1=;suf[t1]=inf;
for(i=;i<=cntb;i++){
for(j=t1-;j>b[i].t;j--) suf[j]=suf[j+];
t1=b[i].t;
if(!vis[b[i].to]) vis[b[i].to]=,cntvb++;
sumb-=minn[b[i].to]-min(minn[b[i].to],b[i].cost);
minn[b[i].to]=min(minn[b[i].to],b[i].cost);
// cout<<"calc "<<i<<ends<<t1<<ends<<cntvb<<ends<<sumb<<endl;
if(cntvb==n) suf[t1]=sumb;
else suf[t1]=-;
}
// for(i=1;i<=20;i++) cout<<suf[i]<<endl;
t1--;while(t1) suf[t1]=suf[t1+],t1--;
// for(i=1;i<=20;i++) cout<<suf[i]<<endl;
// for(i=1;i<=20;i++) cout<<pre[i]<<endl;
for(i=;i<=cnta;i++){
t1=a[i].t;t2=t1+K+;
if(~pre[t1]&&~suf[t2]) ans=min(ans,(ll)pre[t1]+(ll)suf[t2]);
}
if(ans>=inf) printf("-1");
else printf("%I64d\n",ans);
}

最新文章

  1. 触发bfd 的条件
  2. 安卓基于WifiScanner的签到APP
  3. salesforce 零基础学习(十八)WorkFlow介绍及用法
  4. Codeforces Round #245 (Div. 2) A - Points and Segments (easy)
  5. 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
  6. WebService学习笔记系列(四)
  7. wx.Dialog
  8. uart串口协议
  9. Java运行时环境---ClassLoader类加载机制
  10. [Swift]LeetCode423. 从英文中重建数字 | Reconstruct Original Digits from English
  11. /etc/profile文件被改坏导致命令不可用
  12. Nginx(二)-服务模式运行nginx之WINSW
  13. vue-cli3.0
  14. 使用js请求Servlet时的路径
  15. SpringBoot------MockMvc单元测试
  16. jackson中自定义处理序列化和反序列化
  17. SPOJ - HIGH Highways(矩阵树定理)
  18. java 内存分析之方法返回值二
  19. Elasticsearch入坑指南之RESTful API
  20. 菜单条 Menu Bar Action

热门文章

  1. cuda中当元素个数超过线程个数时的处理案例
  2. java 字符串中是否有数字
  3. form中 单选框 input[type="radio"] 分组
  4. 解决Linux使用php命令 -base comment not found并安装composer
  5. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码
  6. STM32串口——中断方式的一般配置方法
  7. A1031 Hello World for U (20)(20 分)
  8. Python 交互模式中 Delete/Backspace 键乱码问题
  9. SpringCloud 微服务一:spring boot 基础项目搭建
  10. Nodejs-文件系统操作