比赛 2025.9.6 评测结果 AAAAAAAAAAAA
题目名称 Compatible Pairs 最终得分 100
用户昵称 淮淮清子 运行时间 1.936 s
代码语言 C++ 内存使用 16.09 MiB
提交时间 2025-09-06 10:32:29
显示代码纯文本
#include<iostream>
#include<unordered_map>
#include<queue>
using namespace std;

#define int long long

const int MAXM = 1e6 + 5;
const int MAXN= 2 * 1e5 + 5;
int N, A, B;
struct node{
	int to, next;
}e[MAXM];
int val[MAXN], sum[MAXN];
int in[MAXN], id[MAXN];
int h[MAXN];
unordered_map<int, int> index;
int tot = 0, ans = 0;

void add(int x, int y){
	e[++ tot] = {y, h[x]};
	h[x] = tot; in[x] ++;
}

void Topsort(){
	queue<int> q;
	for(int i = 1;i <= N;i ++){
		if(in[i] == 1) q.push(i);
	}
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i = h[u];i;i = e[i].next){
			int v = e[i].to;
			if(u == v){
				ans += (val[u] >> 1);
				val[u] = val[u] & 1;
			}
			else if(val[v] > 0){
				int cut = min(val[u], val[v]);
				val[u] -= cut, val[v] -= cut;
				ans += cut;
				q.push(v);
			}
		}
	}
}

signed main(){
	freopen("Compatible.in", "r", stdin);
	freopen("Compatible.out", "w", stdout);
	cin >> N >> A >> B;
	
	for(int i = 1;i <= N;i ++){
		cin >> val[i] >> id[i];
		index[id[i]] = i;
	}
	
	for(int i = 1;i <= N;i ++){
		int ID = id[i];
		if(ID <= A && index[A - ID]) add(i, index[A - ID]);
		if(A != B && ID <= B && index[B - ID]) add(i, index[B - ID]);
	}
	
	Topsort();
	
	cout << ans << '\n';
	
	return 0;
}