其实没啥的。
离散化后,每行每列选择一个。
但是可能会相交
每行或每列相邻两个点成为一小段。
小段按照行列左右部点
小段有交,连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. FFT初步代码分析和逼近曲线

    FFT:快速傅里叶变换 文章从两个方面来写,一个是FFT的基础知识,也就是将时域信号转换为频域信号,另一个是合成时域信号. 将时域信号转换为频域信号 代码来源于http://bigsec.net/b5 ...

  2. java-多态-object

    概要图 一 多态 1.1 多态的产生 下面的 红色部分降低了代码的可扩展性 Dog d = new Dog(); method(d); Cat c = new Cat(); method(c); } ...

  3. Leetcode575.Distribute Candies分糖果

    给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数. 示例 1: 输入: candies ...

  4. 微信小程序之组件开发中的基础知识

    跟着视频开始小程序的项目的开发,视频中这个小程序已经上线了,可以很好的看着小程序的界面进行开发,昨天看了一下具体的需求,觉得真的细节好多啊,而且其中设计的组件的思想也是很好的,能够很好的实现代码的复用 ...

  5. [C#] 利用方向鍵移動 TextBox Focus

    論壇問題 版面上有 100 個 textbox,編號為 1-100,textbox 排列為 1 欄 20 個,共 5 欄,當一開打這個 form 會將在第一欄第一列第一個 textbox 的背景顏色變 ...

  6. 学习JDK1.8集合源码之--TreeSet

    1. TreeSet简介 TreeSet是Set的实现类之一,是不可重复集合,非线程安全的. TreeSet是SortedSet的唯一实现类,实现了元素的自动排序,排序不是以插入的顺序排序,而是默认以 ...

  7. 学习JDK1.8集合源码之--Stack

    1. Stack简介 Stack是集合中对数据结构栈的一种实现,栈的原则是先进先后出,与队列相反(先进先出).Stack是继承自Vector的,意味着它也是由数组实现的线程安全的,不考虑线程安全的情况 ...

  8. 获得CSM(Certified Scrum Master)-价值驱动交付。

    2019年越来越多的企业开始实行敏捷转型,紧随时代潮流,学习最先进的科学管理方法,找到正确的人(团队),为企业交付高价值的产品服务. 导师Ethan ,培训的课程让人收益匪浅,活到老学到老,丰富的知识 ...

  9. js正则表达式常见规则整理

    验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...

  10. [idea]Error:java: invalid source release: 1.8 标签: idea 2017-02-24 15:50 961人阅读

    最近用idea敲struts,虽然idea的界面很好看,代码提示也很强大,不过也的确是碰到了一些在eclipse上从来没有碰到过的问题,而且我发现,idea的错误,很多都是在外国的网站上提问的人比较多 ...