题意:

思路:Orz Claris

先找出所有平方项,将与有平方项的数有关的数对暂时忽略,剩下的直接连边就是一张二分图,暴力DFS染色

将有平方项的数两边都加一个,再判字典序即可

我不会判字典序……耽误了一个下午

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<bitset>
#include<ctime>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 410000
#define M 51
#define MOD 1000000007
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int Data[N],a[N],b[N],x[N],y[N],c[N],flag[N];
vector<int>q[N]; void prepare(int *x,int n)
{
for(int i=;i<=n;i++) Data[i]=x[i];
sort(Data+,Data+n+);
int m=unique(Data+,Data+n+)-Data-;
for(int i=;i<=n;i++) x[i]=lower_bound(Data+,Data+m+,x[i])-Data;
} void dfs(int u)
{
if(!flag[u]) flag[u]=;
for(int i=;i<=(int)q[u].size()-;i++)
{
int v=q[u][i];
if(!flag[v])
{
flag[v]=-flag[u];
dfs(v);
}
}
} int main()
{
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
int n;
scanf("%d",&n);
int m=;
for(int i=;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for(int i=;i<=n;i++) a[++m]=x[i];
for(int i=;i<=n;i++) a[++m]=y[i];
for(int i=;i<=m;i++) b[i]=a[i];
prepare(a,m);
for(int i=;i<=n;i++) x[i]=a[i];
for(int i=;i<=n;i++) y[i]=a[i+n];
for(int i=;i<=m;i++) c[a[i]]=b[i]; m=;
for(int i=;i<=n*;i++) m=max(m,a[i]);
memset(a,,sizeof(a));
for(int i=;i<=n;i++)
if(x[i]==y[i]) a[x[i]]=;
for(int i=;i<=m;i++) q[i].clear();
for(int i=;i<=n;i++)
if(!a[x[i]]&&!a[y[i]])
{
q[x[i]].push_back(y[i]);
q[y[i]].push_back(x[i]);
}
memset(flag,,sizeof(flag));
for(int i=;i<=m;i++)
if(!flag[i]&&!a[i]) dfs(i);
int n1=,n2=;
memset(x,,sizeof(x));
memset(y,,sizeof(y));
for(int i=;i<=m;i++)
{
if(flag[i]==) x[++n1]=i;
if(flag[i]==) y[++n2]=i;
}
for(int i=;i<=m;i++)
if(a[i]==)
{
x[++n1]=i;
y[++n2]=i;
}
sort(x+,x+n1+);
sort(y+,y+n2+);
if(n1==n2)
{
int flag=;
for(int i=;i<=n1;i++)
{
if(x[i]<y[i]) break;
if(x[i]>y[i]){flag=; break;}
}
if(flag)
for(int i=;i<=n1;i++) swap(x[i],y[i]); }
if(n1>n2) {
for(int i=;i<=n1;i++) swap(x[i],y[i]);
swap(n1,n2);
}
printf("%d %d\n",n1,n2);
for(int i=;i<=n1;i++) printf("%d ",c[x[i]]);
printf("\n");
for(int i=;i<=n2;i++) printf("%d ",c[y[i]]);
return ;
}

【EOJ3652】乘法还原(二分图)的更多相关文章

  1. 2018 noip 考前临死挣扎

    基础算法 倍增 贪心 分块 二分 三分 数据结构 线段树 对顶堆 数学 质数 约数 同余 组合 矩阵乘法 图论 二分图判定以及最大匹配 字符串 Tire树 KMP 最小表示法 Hash Manache ...

  2. PC逆向之代码还原技术,第五讲汇编中乘法的代码还原

    目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...

  3. POJ3308 Paratroopers(最小割/二分图最小点权覆盖)

    把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...

  4. hdu_5354_Bipartite Graph(cdq分治+并查集判二分图)

    题目链接:hdu_5354_Bipartite Graph 题意: 给你一个由无向边连接的图,问对于每一个点来说,如果删除这个点,剩下的点能不能构成一个二分图. 题解: 如果每次排除一个点然后去DFS ...

  5. PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

    目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操 ...

  6. 【NOI2003——搜索+二分图匹配优化】

    A 文本编辑器 无旋treap真好看 B 木棒游戏 暴力神仙题 C 数据生成器 树的直径两端点为Y, Z D 智破连环阵 搜索+二分图匹配优化 第一次写欸 列一下 void dfs (int y,in ...

  7. BZOJ4025 二分图(线段树分治+并查集)

    之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...

  8. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

  9. 网络流24题 第五题 - PowerOJ1740 CodeVS1905 圆桌问题 二分图多重匹配 网络最大流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - PowerOJ1740 - 有SPJ - 推荐 题目传送门 - CodeVS1905 - 无SPJ - 0% ...

随机推荐

  1. linux命令大全(转载)

    在搭建openstack时遇到问题,导致上网查询相关信息.找到一篇不错的文章,希望对大家有用.下附地址: http://blog.csdn.net/junbujianwpl/article/detai ...

  2. Vue学习(四):条件渲染

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 九度OJ--Q1167

    import java.util.Scanner;import java.util.TreeSet; /* * 题目描述: * 输入一个数组的值,求出各个值从小到大排序后的次序. * 输入: * 输入 ...

  4. Python 3 学习笔记之——错误和异常

    1. 语法错误 Python 的语法错误被称为解析错,语法分析器会指出出错的代码行,并且在最先找到的错误的位置标记一个小小的箭头. >>> while True File " ...

  5. PAT——乙级1006:换个格式输出整数&乙级1021:个位数统计&乙级1031:查验身份证

    1006 换个格式输出整数 (15 point(s)) 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 ...

  6. Gated Recurrent Unit (GRU)

                                   Gated Recurrent Unit (GRU) Outline                             Backgr ...

  7. JavaSE复习(六)函数式接口

    函数式接口 有且仅有一个抽象方法的接口 @FunctionalInterface注解 一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错.需要注 意的是,即使 ...

  8. hdu 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. 【题解】【CF Round #278】Tourists

    圆方树第二题…… 图中询问的是指定两点之间简单路径上点的最小权值.若我们建出圆方树,圆点的权值为自身权值,方点的权值为所连接的圆点的权值最小值(即点双连通分量中的最小权值).我们可以发现其实就是这两点 ...

  10. [UOJ#351]新年的叶子

    [UOJ#351]新年的叶子 试题描述 躲过了AlphaGo 之后,你躲在 SingleDog 的长毛里,和它们一起来到了AlphaGo 的家.此时你们才突然发现,AlphaGo 的家居然是一个隐藏在 ...