Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the olympiad should meet together in Metropolis (the capital of the country) for the problem preparation process.

There are *n* + 1 cities consecutively numbered from 0 to *n*. City 0 is Metropolis that is the meeting point for all jury members. For each city from 1 to *n* there is exactly one jury member living there. Olympiad preparation is a long and demanding process that requires *k* days of work. For all of these *k* days each of the *n* jury members should be present in Metropolis to be able to work on problems.

You know the flight schedule in the country (jury members consider themselves important enough to only use flights for transportation). All flights in Metropolia are either going to Metropolis or out of Metropolis. There are no night flights in Metropolia, or in the other words, plane always takes off at the same day it arrives. On his arrival day and departure day jury member is not able to discuss the olympiad. All flights in Megapolia depart and arrive at the same day.

Gather everybody for *k* days in the capital is a hard objective, doing that while spending the minimum possible money is even harder. Nevertheless, your task is to arrange the cheapest way to bring all of the jury members to Metrpolis, so that they can work together for *k* days and then send them back to their home cities. Cost of the arrangement is defined as a total cost of tickets for all used flights. It is allowed for jury member to stay in Metropolis for more than *k* days.

Input

The first line of input contains three integers *n*, *m* and *k* (1 ≤ *n* ≤ 105, 0 ≤ *m* ≤ 105, 1 ≤ *k* ≤ 106).

The *i*-th of the following *m* lines contains the description of the *i*-th flight defined by four integers *d**i*, *f**i*, *t**i* and *c**i* (1 ≤ *d**i* ≤ 106, 0 ≤ *f**i* ≤ *n*, 0 ≤ *t**i* ≤ *n*, 1 ≤ *c**i* ≤ 106, exactly one of *f**i* and *t**i* equals zero), the day of departure (and arrival), the departure city, the arrival city and the ticket cost.

Output

Output the only integer that is the minimum cost of gathering all jury members in city 0 for *k* days and then sending them back to their home cities.

If it is impossible to gather everybody in Metropolis for *k* days and then send them back to their home cities, output "-1" (without the quotes).

Examples

Input

```
2 6 5
1 1 0 5000
3 2 0 5500
2 2 0 6000
15 0 2 9000
9 0 1 7000
8 0 2 6500
```

Output

```
24500
```

Input

```
2 4 5
1 2 0 5000
2 1 0 4500
2 1 0 3000
8 0 1 6000
```

Output

```
-1
```

Note

The optimal way to gather everybody in Metropolis in the first sample test is to use flights that take place on days 1, 2, 8 and 9. The only alternative option is to send jury member from second city back home on day 15, that would cost 2500 more.

In the second sample it is impossible to send jury member from city 2 back home from Metropolis.

## 题意:

给你N个大使,M个航班,和一个天数K,

对于每一个航班i,有四个信息,分别是日期,起始站,目标站,价格。

其中起始站和目标站一定有一个是0节点。

让你把1~n个大使都从第i个城市接到0节点,开K天及以上的的会议,然后再全部送回他们的城市。

使之花费的成本最小。

## 思路:

读入的时候找出最大的天数maxtime。

从1到maxtime维护一个全部人可以送到0城市的最小消费

然后从maxtime到1反向维护一个把全部人送回去的最小消费。

然后1到maxtime 取一个min既是ans。

``` cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 2000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
int time;
int f;
int t;
ll cost;
} a[maxn];
int n;
int m;
int k;
bool cmp(node aa, node bb)
{
return aa.time < bb.time;
}
int incnt = 0;
int outcnt = 0;
ll in[maxn];
ll out[maxn];
ll sumin[maxn];
ll sumout[maxn];
ll sum1 = 0ll;
ll sum2 = 0ll;
int main()
{
// freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\common_text\code_stream\out.txt","w",stdout);
gbtb;
cin >> n >> m >> k;
ll mtime = 0;
repd(i, 1, m)
{
cin >> a[i].time >> a[i].f >> a[i].t >> a[i].cost;
mtime = max(mtime, 1ll * a[i].time);
}
sort(a + 1, a + 1 + m, cmp);
repd(i, 1, m)
{
if (a[i].t == 0)
{
if (in[a[i].f] == 0)
{
incnt++;
in[a[i].f] = a[i].cost;
sum1 += a[i].cost;
} else
{
if (in[a[i].f] > a[i].cost)
{
sum1 -= in[a[i].f];
sum1 += a[i].cost;
in[a[i].f] = a[i].cost;
}
}
if (incnt == n)
{
sumin[a[i].time] = sum1;
}
}
}
for (int i = m; i >= 1; i--)
{

if (a[i].f == 0)
{
if (out[a[i].t] == 0)
{
outcnt++;
out[a[i].t] = a[i].cost;
sum2 += a[i].cost;
} else
{
if (out[a[i].t] > a[i].cost)
{
sum2 -= out[a[i].t];
sum2 += a[i].cost;
out[a[i].t] = a[i].cost;
}
}
if (outcnt == n)
{
sumout[a[i].time] = sum2;
}
}
}
ll ans = 11731173111173111;
repd(i, 1, mtime)
{
if (sumin[i] == 0)
sumin[i] = sumin[i - 1];
else if (sumin[i - 1])
sumin[i] = min(sumin[i], sumin[i - 1]);
}
for (int i = mtime; i >= 1; i--)
{
if (sumout[i] == 0)
{
sumout[i] = sumout[i + 1];
}
else if (sumout[i + 1])
sumout[i] = min(sumout[i], sumout[i + 1]);
}
repd(i, 1, mtime - k - 1)
{
if (sumout[i + k + 1] && sumin[i])
ans = min(ans, sumout[i + k + 1] + sumin[i]);
}
if (ans != 11731173111173111)
cout << ans << endl;
else
cout << -1 << endl;
return 0;
}

inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}
 
```

Jury Meeting CodeForces - 854D (前缀和维护)的更多相关文章

  1. Jury Meeting CodeForces - 854D

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

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

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

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

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

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

  5. cf 853 B Jury Meeting [前缀和]

    题面: 传送门 思路: 看完题目以后,首先有一个结论:每个人都是先去到首都,等待开会,开会结束以后再一个个走掉 而且这道题只有去首都和离开首都的机场 因此考虑计算去首都的飞机的前缀最小花费,以及离开首 ...

  6. 【Codeforces Round #433 (Div. 1) B】Jury Meeting

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

  7. Codeforces 853B Jury Meeting

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

  8. codeforces round 433 D. Jury Meeting

    题目大意: 输入n,m,k,分别代表城市的数量,城市编号1~n,航班的数量以及会议必须所有人员到会一起商议的天数,然后及时输入m行航班的信息,每一行输入d,f,t,c分别表示航班到站和始发的那一天(始 ...

  9. hdu_5776_sum(前缀和维护)

    题目链接:hdu_5776_sum 题意: 给你一串数,问你是否有一个连续的子序列的和为m的倍数 题解: 维护一个前缀和%m的值,如果前缀和%m的值为0或者有两个前缀和%m的值相同,那么就有一个连续区 ...

随机推荐

  1. Echars鼠标点击事件多次触发

    gChart.on('click', function (params) { if (params.componentSubType == "bar" && par ...

  2. kmp算法python实现

    kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...

  3. SQL Server 创建用户报错:消息 15023,级别 16,状态 1,第 1 行 用户、组或角色 'XXX' 在当前数据库中已存在。

    问题描述: 原因: 当数据库恢复到其他服务器时,原数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户. 这种情况可能会出现上面的问题.该问题是无法通过新建登录或者是 ...

  4. MySql基本使用方法

    一,基本概念 1, 常用的两种引擎:         (1) InnoDB        a,支持ACID,简单地说就是支持事务完整性.一致性:         b,支持行锁,以及类似ORACLE的一 ...

  5. M码小黄衫买家秀=w=

    M码小黄衫买家秀=w= 17°的天气穿不了短袖polo..就只能这样强行上图啦~ 因为我一直耿耿于大一面向对象课上拿到的那件XL码小黄衫,长到能穿到膝盖,拍小黄衫全家福时候只能很凄凉的借了件小号的穿, ...

  6. Servlet工作原理解析(tomcat7、嵌入式服务器)

      目录 Servlet 容器Tomcat Servlet 容器的启动过程 Web 应用的初始化工作 Servlet 体系结构 创建 Servlet 对象(如何被加载) 初始化 Servlet(如何被 ...

  7. SQL LIKE 操作符

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...

  8. 设计模式C++实现——装饰者模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/28633123 模式定义:         装 ...

  9. jenkins中布置python测试

    测试代码 #coding:utf- import unittest class MyTest(unittest.TestCase): # 继承unittest.TestCase def tearDow ...

  10. [matlab] 23.matlab自带kmeans函数 实现聚类

    clc,clear all; point=[1.40000000000000,0.200000000000000;1.40000000000000,0.200000000000000;1.300000 ...