其实没啥的。
离散化后,每行每列选择一个。
但是可能会相交
每行或每列相邻两个点成为一小段。
小段按照行列左右部点
小段有交,连inf边,每个s-左,右-t,连1
最小割。
输出方案真的很麻烦。。。
 
代码难度>思维含量的网络流,,,
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
}
//using namespace Modulo;
namespace Miracle{
const int N=;
const int inf=0x3f3f3f3f;
int n;
struct node{
int nxt,to;
int w;
}e[*(N*N+N+N)];
int hd[*N],cnt=;
void add(int x,int y,int w){
e[++cnt].nxt=hd[x];
e[cnt].to=y;e[cnt].w=w;
hd[x]=cnt; e[++cnt].nxt=hd[y];
e[cnt].to=x;e[cnt].w=;
hd[y]=cnt;
}
int d[*N];
int s,t;
int dfs(int x,int flow){
if(x==t) return flow;
int res=flow;
for(reg i=hd[x];i&&res;i=e[i].nxt){
int y=e[i].to;
if(d[y]==d[x]+){
int k=dfs(y,min(res,e[i].w));
if(!k) d[y]=;
res-=k;
e[i].w-=k;
e[i^].w+=k;
}
}
return flow-res;
}
int q[*N],l,r;
bool bfs(){
l=,r=;
memset(d,,sizeof d);
q[++r]=t;
d[t]=t+;
while(l<=r){
int x=q[l++];
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(e[i^].w&&!d[y]){
d[y]=d[x]-;
q[++r]=y;
if(y==s) return true;
}
}
}
return false;
}
struct po{
int x,y;
po(){}
po(int xx,int yy){
x=xx;y=yy;
}
void op(){
ot(x);ot(y);
}
}p[N]; struct line{
int pos,l,r;
}X[N],Y[N];
int cx,cy; int th[N],hc;
int tl[N],lc;
vector<int>hang[N],lie[N];
vector<int>ex[N],ey[N];
bool jiao(line a,line b){
if((b.l<=a.pos&&a.pos<=b.r)&&(a.l<=b.pos&&b.pos<=a.r)) return true;
return false;
} bool vis[*N];
void fin(){
l=,r=;
q[++r]=s;
vis[s]=;
while(l<=r){
int x=q[l++];
// cout<<" fin "<<x<<endl;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(!vis[y]&&e[i].w){
vis[y]=;
q[++r]=y;
}
}
}
// cout<<" visiv "<<endl;
// prt(vis,s,t);
} struct sol{
po a,b;
}ax[N],ay[N];
int ansx,ansy;
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(p[i].x);rd(p[i].y);
tl[++lc]=p[i].x;
th[++hc]=p[i].y;
}
sort(tl+,tl+lc+);
lc=unique(tl+,tl+lc+)-tl-;
sort(th+,th+hc+);
hc=unique(th+,th+hc+)-th-;
for(reg i=;i<=n;++i){
int tx=lower_bound(tl+,tl+lc+,p[i].x)-tl;
int ty=lower_bound(th+,th+hc+,p[i].y)-th;
hang[ty].pb(p[i].x);
lie[tx].pb(p[i].y);
}
for(reg i=;i<=lc;++i) sort(lie[i].begin(),lie[i].end());
for(reg i=;i<=hc;++i) sort(hang[i].begin(),hang[i].end());
for(reg i=;i<=lc;++i){
if(!lie[i].size()) continue;
int las=lie[i][];
for(reg j=;j<lie[i].size();++j){
int now=lie[i][j];
if(now->=las+){
++cx;
X[cx].pos=tl[i];
X[cx].r=now-;
X[cx].l=las+;
ex[i].pb(cx);
}
las=now;
}
}
for(reg i=;i<=hc;++i){
if(!hang[i].size()) continue;
int las=hang[i][];
for(reg j=;j<hang[i].size();++j){
int now=hang[i][j];
if(now->=las+){
++cy;
Y[cy].pos=th[i];
Y[cy].r=now-;
Y[cy].l=las+;
ey[i].pb(cy);
}
las=now;
}
}
s=;t=cx+cy+; for(reg i=;i<=cx;++i){
add(s,i,);
for(reg j=;j<=cy;++j){
if(jiao(X[i],Y[j])){
// cout<<" jiao "<<i<<" j "<<j<<endl;
add(i,j+cx,inf);
}
}
}
for(reg i=;i<=cy;++i){
add(i+cx,t,);
} while(bfs())while(dfs(s,inf)); fin();
// cout<<" cx "<<cx<<" cy "<<cy<<endl; for(reg i=;i<=lc;++i){ if(!lie[i].size()) continue;
int le=lie[i][],ri;
for(solid now:ex[i]){
if(vis[s]!=vis[now]){ ri=X[now].l-;
++ansx;
ax[ansx].a=po(X[now].pos,le);
ax[ansx].b=po(X[now].pos,ri);
le=X[now].r+;
}
}
ri=lie[i][lie[i].size()-];
++ansx;
ax[ansx].a=po(tl[i],le);
ax[ansx].b=po(tl[i],ri);
} for(reg i=;i<=hc;++i){
// cout<<" i "<<i<<" : "<<th[i]<<endl;
if(!hang[i].size()) continue;
int le=hang[i][],ri;
for(solid now:ey[i]){
if(vis[t]!=vis[now+cx]){
ri=Y[now].l-;
++ansy;
// cout<<" new "<<endl;
ay[ansy].a=po(le,Y[now].pos);
ay[ansy].b=po(ri,Y[now].pos);
le=Y[now].r+;
}
}
ri=hang[i][hang[i].size()-];
++ansy;
ay[ansy].a=po(le,th[i]);
ay[ansy].b=po(ri,th[i]);
} printf("%d\n",ansy);
for(reg i=;i<=ansy;++i){
ay[i].a.op();ay[i].b.op();puts("");
}
// puts("");
printf("%d\n",ansx);
for(reg i=;i<=ansx;++i){
ax[i].a.op();ax[i].b.op();puts("");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
 

CF1054F Electric Scheme的更多相关文章

  1. 一句话题解&&总结

    CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...

  2. Partition:Partiton Scheme是否指定Next Used?

    在SQL Server中,为Partition Scheme多次指定Next Used,不会出错,最后一次指定的FileGroup是Partition Scheme的Next Used,建议,在执行P ...

  3. Android业务组件化之URL Scheme使用

    前言: 最近公司业务发展迅速,单一的项目工程不再适合公司发展需要,所以开始推进公司APP业务组件化,很荣幸自己能够牵头做这件事,经过研究实现组件化的通信方案通过URL Scheme,所以想着现在还是在 ...

  4. iOS - URL Scheme 操作

    推荐JLRoutes路由跳转 NSScanner 在寻找更加灵活的页面跳转和通知,我遇见了JLRoutes,从而学习使用URL Scheme来定义界面入口.以前从来没有使用过,不过很多大厂和流行的框架 ...

  5. 自定义 URL Scheme 完全指南

    本文由 Migrant 翻译自 The Complete Tutorial on iOS/iPhone Custom URL Schemes,转载请注明出处. 注意: 自从自定义 URL 的引入,本文 ...

  6. JS魔法堂:Data URI Scheme介绍

    一.前言 上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说这个有用,有同事说这个没啥用,后来还延伸到网站性能的话题上,大家讨论的激烈程度让我觉得这次选题还不错.本篇先 ...

  7. CSS魔法堂:小结一下Box Model与Positioning Scheme

    前言  对于Box Model和Positioning Scheme中3种定位模式的细节,已经通过以下几篇文章记录了我对其的理解和思考.  <CSS魔法堂:重新认识Box Model.IFC.B ...

  8. Project、Target、Workspace and Scheme

    前言 今天有人问我Target和Project是什么关系?额...学习iOS开发都知道Target和Project的关系.这里我就简单的做了一个总结,而且加入的Scheme和Workspace.如果不 ...

  9. 自定义 URL Scheme 完全指南(转载)

    iPhone / iOS SDK 最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于从浏览器或其他应用中启动本应用. 注册自定义 URL Scheme ...

随机推荐

  1. 洛谷P1456Monkey King

    洛谷P1456 Monkey King 题目描述 Once in a forest, there lived N aggressive monkeys. At the beginning, they ...

  2. python利用Remove.bg接口自动去背景(转)

    转 https://blog.csdn.net/Quentin_he/article/details/97569625 前段时间基友找我让帮忙把他的结婚登记照扣出来换一个背景当作简历照,好在我之前学过 ...

  3. Ubuntu上更换163源 - Mars Loo的博客

    转载*请注明原始出处:http://blog.csdn.net/a464057216/article/details/50865895 先备份源/etc/apt/sources.list为source ...

  4. 使用Data Lake Analytics + OSS分析CSV格式的TPC-H数据集

    0. Data Lake Analytics(DLA)简介 关于Data Lake的概念,更多阅读可以参考:https://en.wikipedia.org/wiki/Data_lake 以及AWS和 ...

  5. js实现翻转一个字符串

    字符串作在程序中是非常常见的,因为程序中绝大部分的数据都可以当作字符串来处理.在这里介绍几种翻转字符串的方法. (1)使用字符串函数 //使用数组翻转函数 function reverseString ...

  6. golang数组 排序和查找

    package main import "fmt" func BubbleSort(arr *[5]int){ fmt.Println("排序前arr=",(* ...

  7. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    问题背景 C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了.于是C#小白的我天真的以为只要调用C#端的S ...

  8. 手把手教你实现一个通用的jsonp跨域方法

    什么是jsonp JSONP(JSON with Padding)是JSON的一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位于 server1 ...

  9. 重温 Webpack, Babel 和 React

    开始之前 在书写文章之前,我假设大家已经有了 JavaScript,Node 包管理工具,Linux 终端操作 这些基本技能,接下来,我将一步一步指引大家从头搭建一个 React 项目 最终实现的效果 ...

  10. oracle 写存储过程有返回值时 注意在loop循环处添加返回值:=

    例子: create or replace procedure p_xl is v_count NUMBER(10); begin for rs in(select yhbh from dbyh) l ...