Problem:
MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]} });

B: 全日本帰りたい協会

問題

株式会社 AOR (Association Of Return home)には $N$ 人の社員がいる。

社員 $i$ はエレベーターを使って $1$ 階に下りたいと考えており、時刻 $t_i$ に $F_i$ 階のエレベーター前にやってくる。あなたは時刻 $0$ に $1$ 階に $1$ 基だけあるエレベーターを遠隔操作し、すべての社員を $1$ 階に送ることにした。エレベーターには $D$ 人までしか乗せられない。
エレベーターは単位時間に一階分移動するかその場にとどまる事ができる。 社員 $i$ はエレベーターが時刻 $t_i$ に $F_i$ 階にあって、自分が乗っても定員を超過しないときのみエレベーターに乗る。 時刻 $t_i$ にエレベーターに乗れないとき、階段で $1$ 階におりてしまう。 なお、乗り降りにかかる時間は無視できる。

それぞれの社員がエレベーターに乗っている時間の合計の最小値を求めよ。 ただし、エレベーターで $1$ 階へ運べない人が $1$ 人でもいる場合は $-1$ を出力せよ。

制約

$1 \le N \le 10^5$

$1 \le D \le 10^5$

$1 \le t_i \lt t_{i+1} \le 10^6$

$2 \le F_i \le 10^6$

入力は全て整数で与えらえる。

入力形式

入力は以下の形式で与えられる。

$N \ D$
$t_1 \ F_1$
$t_2 \ F_2$
$\vdots$
$t_N \ F_N$

出力

それぞれの社員がエレベーターに乗っている時間の合計の最小値を出力せよ。ただし、エレベーターで $1$ 階へ運べない人が $1$ 人でもいる場合は $-1$ を出力せよ。また、末尾に改行も出力せよ。

サンプル

サンプル入力 1

2 2
2 2
3 3

サンプル出力 1

5

サンプル入力 2

2 2
2 2
5 3

サンプル出力 2

3

サンプル入力 3

2 2
2 2
3 5

サンプル出力 3

-1

Solution in C (judge verdict: Wrong Answer)

#include<stdio.h>

int main(){

	int N = 0;//??\?????°(?????°)
	int i = 0;//??????????????°
	int D = 0;//??????
	int now_d = 0;//????????°
	int now_s = 0;//?????¨?????????
	int now_f = 1;//?????¨????????°(1?????????????????????)
	int f_diff = 0;//f-now_f
	int total_s = 0;//?????????????????????
	int s = 0;//??\????§???°
	int f = 0;//??\????????°
	
	scanf("%d %d",&N,&D);
	for(i = 0;i < N;i++){
		scanf("%d %d",&s,&f);
		f -= 1;//?????????1????????????????????§0????????????????????´
		
		
		if(now_d < D){//?????¶1
			f_diff = f - now_f;//?????°??????
			if(f_diff < 0) f_diff *= (-1);//?????°???????????¶?????????
			
			
			if(s - now_s >= f_diff){//?????¶3
				if((s - now_s) >= (f + now_f)){//?????¶2
					total_s = total_s + ((now_f) * now_d);//??????
					now_s = s;
					now_f = f;
					now_d = 1;
				}else{
					total_s = total_s + (s - now_s)*now_d;
					now_s = s;
					now_f = f;
					now_d += 1;
				}
			}else{
				total_s = -1;
				break;
			}
		}else{
			total_s = -1;
			break;
		}
	}
//				if((s - now_s) >= (f + now_f)){//?????¶2
//				total_s = total_s + ((now_f) * now_d);//??????
//				now_s = s;
//				now_f = f;
//				now_d = 1;
//			}else if(s - now_s >= f_diff){//?????¶3
//				total_s = total_s + (s - now_s)*now_d;
//				now_s = s;
//				now_f = f;
//				now_d += 1;
//			}else{
//				total_s = -1;
//				break;
//			}			
//		}else{
//			total_s = -1;
//			break;
//		}
//	}

	if(total_s < 0){ 
		printf("%d\n",total_s);//total_s = -1?????´??????-1?????????
	}else{
		total_s = total_s + ((now_f) * now_d);//??????????????????????¨?
		printf("%d\n",total_s);
	}
return 0;
}