Problem:
Problem G: Combine Two Elements

Problem

$N$個の非負整数のペア$(a_i, b_i)$と非負整数$A$, $B$ が与えられる。

以下のいずれかの操作をできるだけたくさん行いたい。

$|a_i - b_i| \leq A$ または $B \leq |a_i - b_i| \leq 2A$を満たす要素$i$を取り出し、削除する

$|(a_i + a_j) - (b_i + b_j)| \leq A$ または $B \leq |(a_i + a_j) - (b_i + b_j)| \leq 2A$ を満たす要素$i$と要素$j$ ($i \neq j$)の組を取り出し、削除する

最大の操作回数を求めよ。

Input

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

$N$ $A$ $B$
$a_1$ $b_1$
$a_2$ $b_2$
...
$a_N$ $b_N$

入力はすべて整数で与えられる。

1行目に$N$,$A$,$B$が空白区切りで与えられる。

2行目以降の$N$行に$i$個目のペア$a_i$と$b_i$($1 \leq i \leq N$)が空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

$1 \leq N \leq 800 $

$0 \leq A, B \leq 10^5 $

$0 \leq a_i, b_i \leq 10^5$

$A \leq B$ かつ $B \leq 2A$

Output

最大の操作回数を1行に出力せよ。

Sample Input 1

5 3 5
7 2
13 1
1 1
2 9
2 4

Sample Output 1

4

(7,2)を選んで削除する。

(1,1)を選んで削除する。

(2,4)を選んで削除する。

(13, 1)と(2, 9)を選んで削除する。

以上のように操作すると４回操作することができ、これが最大となる。

Sample Input 2

10 7 12
34 70
36 0
12 50
76 46
33 45
61 21
0 1
24 3
98 41
23 84

Sample Output 2

5

Solution in C (judge verdict: Accepted)

#include<stdio.h>
#include<stdlib.h>
int MIN(int a,int b){return a<b?a:b;}
int ta[1010],to[2000010],nt[2000010],co[1000010],F[1010];
int MF(int s,int t,int e,int min){
  if(s==t||min==0)return min;
  int i,r;
  F[s]=1;
  for(i=ta[s];i+1;i=nt[i]){
    if(F[to[i]])continue;
    r=MF(to[i],t,e,MIN(min,co[i]));
    co[i]-=r;
    co[(i+e)%(2*e)]+=r;
    if(r)return r;
  }
  return 0;
}
//呼び出す方
//sからtへの最大流を求める　ノード数v辺の数e　aからbへキャパcのフローが流れる
int maxf(int s,int t,int v,int e,int *a,int *b,int *c){
  int i,f,r;
  for(i=0;i<v;i++)ta[i]=-1;
  for(i=0;i<e;i++){
    nt[i  ]=ta[to[i+e]=a[i]];
    nt[i+e]=ta[to[i  ]=b[i]];
    co[ta[a[i]]=i  ]=c[i];
    co[ta[b[i]]=i+e]=0;
  }
  for(f=0;r=MF(s,t,e,1000000000);f+=r){
    for(i=0;i<v;i++)F[i]=0;
  }
  return f;
}
int main(){
  int n,s,t,i,j,l,u,v,f[100010]={};
  int a[200010],b[200010],c[200010],e=0,ans=0,d[100010];
  scanf("%d %d %d",&n,&s,&t);
  for(i=0;i<n;i++){
    scanf("%d %d",&u,&v);
    d[i]=u-v;
    if(abs(d[i])<=s||t<=abs(d[i])&&abs(d[i])<=s*2){
      ans++;//printf("%d %d",u,v);
      f[i]=1;
    }
  }//printf("%d\n",ans);
  for(i=0;i<n;i++){
    if(f[i]||d[i]>0)continue;
    for(j=0;j<n;j++){
      if(f[j]||d[j]<0)continue;
      l=abs(d[i]+d[j]);
      if(l<=s||t<=l&&l<=s*2){
	a[e  ]=i;
	b[e  ]=j;
	c[e++]=1;
      }
    }
  }
  for(i=0;i<n;i++){
    if(f[i])continue;
    if(d[i]<0){
      a[e  ]=n;
      b[e  ]=i;
      c[e++]=1;
    }
    else{
      a[e  ]=i;
      b[e  ]=n+1;
      c[e++]=1;
    }
  }
  //for(i=0;i<e;i++)printf("%d %d\n",a[i],b[i]);
  printf("%d\n",maxf(n,n+1,n+2,e,a,b,c)+ans);
  return 0;
}