题意:

思路: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. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库

    我是 环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环 ...

  2. LARK BOARD开发板入门学习-第2篇

    1. 本次主要研究下HDMI接口,使用芯片是CH7033,这个芯片可以接VGA和HDMI两种接口,和FPGA的接口是地址数据总线 2. 值得注意的地方,下图的D1,双二极管BAT54S在电路中一般用于 ...

  3. 不同浏览器css引入外部字体的方式

    /** * 字体后缀和浏览器有关,如下所示 * .TTF或.OTF,适用于Firefox 3.5.Safari.Opera * .EOT,适用于Internet Explorer 4.0+ * .SV ...

  4. Python-学习-小例子练习

    网上了点小例子,练习一下下,都是特别简单的.而且这些代码也都是找的网上的代码,目的是在于练习一下Python和熟悉下Python的编码风格等等 学习一门语言,最快的方法就是把它用在世界的开发中,这样才 ...

  5. 名字管理系统demo

    # 名字管理系统demo # 打印功能提示 print('欢迎使用名字管理系统v6.6.6') print('1:添加一个名字') print('2:删除一个名字') print('3:修改一个名字' ...

  6. selenide 自动化UI测试中Configuration全局配置项目

    selenide 在测试过程中需要设置许多的默认值,方便在测试过程中进行和很好的使用.下面我们在selenide中的api引用过来看看! static Configuration.AssertionM ...

  7. Htmlemail邮件发送

    /** * * @param path //发送附件路径 * @param name //附件名称 * @param hostName //邮件服务器名称 * @param port //服务器端口 ...

  8. 0.爬虫 urlib库讲解 urlopen()与Request()

    # 注意一下 是import urllib.request 还是 form urllib import request 0. urlopen() 语法:urllib.request.urlopen(u ...

  9. 预研报告——MyBatis持久层的demo

    一.预研任务介绍和预研目标 任务介绍: 与 Hibernate 相比, MyBatis 是一个半自动化的持久层框架,以轻量级.效率高.原生代而好评如潮.虽然有在分享会上大致讲解,但是还是重新梳理成文字 ...

  10. BZOJ 2333 SCOI2011 棘手的操作 并查集+可并堆

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干 ...