题意:

思路: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. I两种冒泡算法

    两种冒泡算法: 第一个循环,I 定位当前坐标,第二个循环 把 I 之后的每个数都与 I 比较(比 I 小的都去坐标I),第二个循环之后 坐标 I 为数组里最小的数值. 效率比较高的冒泡算法: stat ...

  2. 『AngularJS』创建 Service

    创建服务 Angular提供了几种有用的服务,对于所有的应用来说,你将会发现这些服务对于创建你自己的服务是有用处的.为了创建自己的服务,你应该从通过一个模块(module)注册一个服务工厂方法开始(可 ...

  3. Python-学习-import语句导入模块

    简单的学习一下调用外部的模块文件. 在Python中,模块是一种组织形式,它将彼此有关系的Pyrhon 代码组织到一个个独立的文件当中,模块可以包含可执行代码,函数,和类或者是这些东西的组合. 当我们 ...

  4. Selenium八大元素定位方式

    1.根据id来定位: import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.sele ...

  5. Java 集合学习--集合概述

    一.集合框架 集合,通常也叫容器,java中有多种方式保存对象,集合是java保存对象(对象的引用)的方式之一,之前学习的数组是保存对象的最有效的方式,但是数组却存在一个缺陷,数组的大小是固定的,但是 ...

  6. Go基础篇【第8篇】: 内置库模块 bytes [二]

    type Reader ¶ type Reader struct { // 内含隐藏或非导出字段 } Reader类型通过从一个[]byte读取数据,实现了io.Reader.io.Seeker.io ...

  7. linux进程同步之信号量

    首先了解一下,信号量机概念是由荷兰科学家Dijkstr引入,值得一提的是,它提出的Dijksrtr算法解决了最短路径问题. 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享 ...

  8. [问题解决]Python locale error: unsupported locale setting

    原文来源:https://stackoverflow.com/questions/14547631/python-locale-error-unsupported-locale-setting 安装f ...

  9. 编程练习:寻找发帖"水王"扩展问题二

    回顾 在前面两篇文章已经实现了水王id出现次数超过一半,以及水王id出现次数刚好一半 分析 借助上面水王id出现次数刚好出现一半的分析,其实这里就是找出数组中出现次数前三的元素,具体的分析,见前面两篇 ...

  10. 【转】配置Tomcat使用https协议(配置SSL协议)

    转载地址:http://ln-ydc.iteye.com/blog/1330674 内容概览: 如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 协议 1.生成安全证书 2.配置to ...