cf 853 B Jury Meeting [前缀和]
2024-08-30 01:07:10
题面:
思路:
看完题目以后,首先有一个结论:每个人都是先去到首都,等待开会,开会结束以后再一个个走掉
而且这道题只有去首都和离开首都的机场
因此考虑计算去首都的飞机的前缀最小花费,以及离开首都的飞机的最小后缀花费
都计算出来以后,对于每一个开始开会的时间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);
}
最新文章
- 触发bfd 的条件
- 安卓基于WifiScanner的签到APP
- salesforce 零基础学习(十八)WorkFlow介绍及用法
- Codeforces Round #245 (Div. 2) A - Points and Segments (easy)
- 2014多校第四场1006 || HDU 4902 Nice boat (线段树 区间更新)
- WebService学习笔记系列(四)
- wx.Dialog
- uart串口协议
- Java运行时环境---ClassLoader类加载机制
- [Swift]LeetCode423. 从英文中重建数字 | Reconstruct Original Digits from English
- /etc/profile文件被改坏导致命令不可用
- Nginx(二)-服务模式运行nginx之WINSW
- vue-cli3.0
- 使用js请求Servlet时的路径
- SpringBoot------MockMvc单元测试
- jackson中自定义处理序列化和反序列化
- SPOJ - HIGH Highways(矩阵树定理)
- java 内存分析之方法返回值二
- Elasticsearch入坑指南之RESTful API
- 菜单条 Menu Bar Action
热门文章
- cuda中当元素个数超过线程个数时的处理案例
- java 字符串中是否有数字
- form中 单选框 input[type="radio"] 分组
- 解决Linux使用php命令 -base comment not found并安装composer
- Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码
- STM32串口——中断方式的一般配置方法
- A1031 Hello World for U (20)(20 分)
- Python 交互模式中 Delete/Backspace 键乱码问题
- SpringCloud 微服务一:spring boot 基础项目搭建
- Nodejs-文件系统操作