首页 > 代码库 > CodeForces 468B Two Sets 二分匹配
CodeForces 468B Two Sets 二分匹配
题目链接:点击打开链接
题意:给定n个数,常数a, b
把n个数放到集合A和集合B
使得:
对于某个数x,若x在A集合则 a-x也必须在A集合(若a-x不存在于n个数中,则x不能放在A集合)
放在B集合同理。
输出任意解:每个数放在哪个集合里(允许n个数都放一个集合)
思路:
类似二分匹配的做法。
import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Main { int work(int x){ if(x%2==0)return x+1; else return x-1; } static int N = 200050; class Node implements Comparable <Node>{ int x, id; Node(int x, int id){ this.x = x; this.id = id; } public int compareTo(Node o){ return Integer.compare(x, o.x); } public String toString(){ return id + "=" + x; } } class Edge{ int from, to, nex; Edge (int from, int to, int nex){ this.from = from; this.to = to; this.nex = nex; } } Edge[] edge = new Edge[N*10]; int[] head = new int[N]; int edgenum; void addedge(int u, int v){ Edge E = new Edge(u, v, head[u]); edge[edgenum] = E; head[u] = edgenum ++; } int n; int[] p = new int[N], ans = new int[N]; int a, b, max; Map<Integer, Integer> map = new HashMap(); boolean match(int x, int y, int col){ int P = map.get(x); if(map.containsKey(y-x) == false) return false; int Q = map.get(y - x); if(ans[Q] == -1 || x * 2 == y){ ans[Q] = ans[P] = col; } else { if(match(a+b-2*y+x, y, col)) ans[Q] = ans[P] = col; else return false; } return true; } boolean solve(){ if(max >= a && max >= b)return false; for(int i = 1; i <= n; i++) if(ans[i] == -1) { if(match(p[i], a, 0)==false && match(p[i], b, 1) == false) return false; } return true; } void init(){ n = cin.nextInt(); a = cin.nextInt(); b = cin.nextInt(); max = 0; for(int i = 1; i <= n; i++){ ans[i] = -1; p[i] = cin.nextInt(); map.put(p[i], i); if(p[i] > max) max = p[i]; } } public void work(){ init(); if(solve()){ out.println("YES"); for(int i = 1; i <= n; i++)out.print(ans[i]+" "); out.println(); } else out.println("NO"); } Main() { cin = new Scanner(System.in); out = new PrintWriter(System.out); } public static void main(String[] args) { Main e = new Main(); e.work(); out.close(); } public Scanner cin; public static PrintWriter out; }
CodeForces 468B Two Sets 二分匹配
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。