题意:几个人要去一个城市k天,现给出各航班的日期和花费,让这n个人能相会k天的最小花费?

用数组arr1[i]记录在第i天人到齐的最小花费。arr2[i]记录第i天之后才有人开始走的最小花费。然后取arr1[i]+arr2[i+k+1]的最小值。

//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
#include <bitset>
#include <iomanip>
using namespace std;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFFFFFFFFFFLL;
lon n,m,k,zcnt;
lon zvst[SZ],zsum,zmin[SZ],a[SZ];
lon ncnt,nvst[SZ],nsum,nmin[SZ],b[SZ];
struct nd{
lon d,from,to,cost;
nd(lon a,lon b,lon c,lon e):d(a),from(b),to(c),cost(e){}
}; bool cmpd(nd &x,nd &y)
{
return x.d<y.d;
} void init()
{
cin>>n>>m>>k;
if(m==)return;
vector<nd> vct;
for(lon i=;i<m;++i)
{
lon d,from,to,cost;
cin>>d>>from>>to>>cost;
vct.push_back(nd(d,from,to,cost));
}
sort(vct.begin(),vct.end(),cmpd);
//for(lon i=0;i<vct.size();++i)cout<<vct[i].d<<endl;
for(lon i=,j=;i<=;++i)
{
a[i]=a[i-];
vector<nd> tmp;
for(;j<vct.size();)
{
//cout<<i<<" "<<j<<" "<<vct[j].d<<endl;
if(vct[j].d==i)
{
//if(i==2)cout<<" "<<j<<" "<<tmp.size()<<endl;
tmp.push_back(vct[j]);++j;
}else break;
}
//if(tmp.size())cout<<i<<" "<<tmp.size()<<endl;
for(lon k=;k<tmp.size();++k)
{
lon d,from,to,cost;
d=tmp[k].d,from=tmp[k].from,to=tmp[k].to;
cost=tmp[k].cost;
if(from)
{
//if(i==3)cout<<"here"<<zvst[d]<<endl;
if(zvst[from]==)
{
zvst[from]=;
++zcnt;
zsum+=cost;
zmin[from]=cost;
}
else
{
if(zmin[from]>cost)
{
zsum-=zmin[from]-cost;
zmin[from]=cost;
}
}
if(zcnt==n)
{
a[d]=zsum;
}
}
}
} for(lon i=,j=vct.size()-;i>=;--i)
{
b[i]=b[i+];
vector<nd> tmp;
for(;j>=;)
{
//cout<<i<<" "<<j<<" "<<vct[j].d<<endl;
if(vct[j].d==i)
{
//if(i==2)cout<<" "<<j<<" "<<tmp.size()<<endl;
tmp.push_back(vct[j]);--j;
}else break;
}
//if(tmp.size())cout<<i<<" "<<tmp.size()<<endl;
for(lon k=;k<tmp.size();++k)
{
lon d,from,to,cost;
d=tmp[k].d,from=tmp[k].from,to=tmp[k].to;
cost=tmp[k].cost;
if(to)
{
if(nvst[to]==)
{
nvst[to]=;
++ncnt;
nsum+=cost;
nmin[to]=cost;
}
else
{
if(nmin[to]>cost)
{
nsum-=nmin[to]-cost;
nmin[to]=cost;
}
}
if(ncnt==n)
{
b[d]=nsum;
}
} }
} // for(lon i=1;i<=1000000;++i)
// {
// if(!b[i]&&b[i-1])b[i]=b[i-1];
// }
} lon work()
{
// for(lon i=1;i<30;++i)
// {
// cout<<a[i]<<" "<<b[i]<<endl;
// }
lon res=INF;
for(lon i=;i<=;++i)
{
lon dst=min(1000002LL,i+k+);
//if(a[i]||b[i])if(i<20)cout<<i<<" "<<a[i]<<" "<<b[i+k+1]<<endl;
if(a[i]!=&&b[dst]!=)
{
res=min(res,a[i]+b[dst]);
}
}
if(res==INF)return -;
else return res;
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
//for(;scanf("%d",&n)!=EOF;)
{
init();
cout<<work()<<endl;
}
return ;
}

codeforces 853b//Jury Meeting// Codeforces Round #433 (Div. 1)的更多相关文章

  1. Codeforces 853B Jury Meeting (差分+前缀和)

    <题目链接> 题目大意: 有$ n(n<=1e5)$个城市和一个首都(0号城市),现在每个城市有一个人,总共有$ m (m<=1e5)$次航班,每个航班要么从首都起飞,要么飞到 ...

  2. Codeforces 853B Jury Meeting

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

  3. Codeforces Round #433 (Div. 2)【A、B、C、D题】

    题目链接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction[水] 题意:已知分子与分母的和,求分子小于分母的 最大的最简分数. #in ...

  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. 【Codeforces Round #433 (Div. 1) B】Jury Meeting

    [链接]h在这里写链接 [题意] 有n个人,它们都要在某一时刻开始,全都到达0位置,然后维持最少k个时间单位,然后再全都回到原来的位置; 第i个人初始的位置是i. 且一共有m班航班. 每一班航班,要么 ...

  7. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)

    A. Fraction 题目链接:http://codeforces.com/contest/854/problem/A 题目意思:给出一个数n,求两个数a+b=n,且a/b不可约分,如果存在多组满足 ...

  8. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D

    Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...

  9. 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)

    cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...

随机推荐

  1. TestDriven.NET 怎么设置快捷键keyboard shortcut(转)

    TestDriven.NET 怎么设置快捷键keyboard shortcut 使用TestDriven.NET 测试的时候,觉得点击鼠标很麻烦是不是?嗯,我也觉得,那么我们来看看怎么设置它的快捷键把 ...

  2. 20165207 2017-2018-2《Java程序设计》课程总结

    20165207 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:学习基础与C语言调查反馈 预备作业3:Linux安装与命令 ...

  3. jsp/servlet/mysql/linux基本概念和操作

    一.什么是OOP编程? 面向对象,以结果为导向,并封装整个过程,并尽可能地增加代码的复用性和可扩展性...... 二.Junit? JUnit是一个java语言的单元测试框架.Junit测试时程序员测 ...

  4. HTML JavaScript 基础学习

    HTML 中肯定会用到 JavaScript 的知识点,会点 JavaScript 的基础知识不会吃亏,其实打算去买JavaScript的教程去专门学习一下,但是交给我的时间不多了,记录一点,能会一点 ...

  5. CF#235E. Number Challenge

    传送门 可以理解为上一道题的扩展板.. 然后我们就可以YY出这样一个式子 ${\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk)=\sum_{i=1}^a\sum_{ ...

  6. GitHub Desktop离线安装包

    GitHub Desktop离线安装包.上传时间是2017-02-05 版本3.3.4.0,Git shell版本是v2.11.0. 百度网盘的下载链接: http://pan.baidu.com/s ...

  7. NOIP Mayan游戏 - 搜索

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有 ...

  8. 将Sublime Text 添加到鼠标右键菜单的教程方法

    安装notepad++软件,在菜单右键自动会添加“edit with notepad++"的选项,那么怎么将Sublime Text 添加到鼠标右键菜单呢?下面是我的操作过程,希望有帮助! ...

  9. MVC5 一套Action的登录控制流程

    流程: 用拦截器控制每一个页面请求和ajax请求,根据请求体的cookie里面是否有token判断是否登录,还必须判断该token在redis里面的缓存是否存在 组成部分: 拦截器: using Sy ...

  10. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...