Codeforces 871C 872E Points, Lines and Ready-made Titles
题
OvO http://codeforces.com/contest/871/problem/C
( Codeforces Round #440 (Div. 1, based on Technocup 2018 Elimination Round 2) - C )
解
问题可以转化为:这些点可以产生的横线与竖线的出现情况
首先,对于二维坐标系中的每一行中,对于每个点,如果右边有点,则从该点向右边这个点(相邻的那个点)连一条边(连一条单向的),
对于每一列中,对于每个点,如果该点下面有点,则向下边这个点(相邻的那个点)连一条边(同上)
(具体实现可以通过排序)
然后对于每个点,将与之相连的点并查集合并,合并时如果发现成环,则这个集合tag=1,否则tag=0。
算出每个集合中所有点所占据的不重复的行列数,记为dif。
对于每个集合,如果这个集合中tag=1,那么这个集合所产生的答案为 2^dif,如果tag=0,那么这个集合所产生的答案为 (2^dif)-1 ,(原因的话,画图可以得出)
每个集合的答案是独立的,所以取他们的积

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <set>
#include <map> using namespace std; typedef long long ll; const int N=4e5+44;
const int mod=1e9+7;
const int bas=1e9+44; struct node{
int u,v;
int next;
} edge[2*N]; struct Point
{
int x,y,id;
} p[N]; int head[N],num,tag[N],cnt[N],dif[N];
int n,ma[N];
set<int> sx[N],sy[N]; int findma(int x)
{
if(ma[x]==x)
return x;
return ma[x]=findma(ma[x]);
} bool cmp1(Point a,Point b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
} bool cmp2(Point a,Point b)
{
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
} bool cmp(Point a,Point b)
{
return a.id<b.id;
} void addedge(int u,int v)
{
edge[num].u=u;
edge[num].v=v;
edge[num].next=head[u];
head[u]=num++;
} void init()
{
int i,j;
num=0;
memset (head,-1,sizeof(head));
for(i=1;i<=n;i++)
ma[i]=i,cnt[i]=1;
memset(tag,0,sizeof(tag));
memset(dif,0,sizeof(dif));
for(i=1;i<=n;i++)
sx[i].clear(),sy[i].clear();;
} long long pr(int a, int b)
{
long long r=1,base=a;
while(b!=0)
{
if(b&1)
r=(r*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return r;
} void solve()
{
int i,j,a,b,pa,pb;
ll ans=1,tmp;
for(i=1;i<=n;i++)
{
for(j=head[i];j!=-1;j=edge[j].next)
{
a=i; b=edge[j].v;
pa=findma(a); pb=findma(b);
if(pa==pb)
{
tag[pa]=1;
}
else
{
ma[pa]=pb;
tag[pb]=tag[pb]|tag[pa];
cnt[pb]+=cnt[pa];
}
}
}
for(i=1;i<=n;i++)
{
a=i; pa=findma(a);
tmp=p[a].x;
if(sx[pa].find(tmp)==sx[pa].end())
{
dif[pa]++;
sx[pa].insert(tmp);
}
tmp=p[a].y;
if(sy[pa].find(tmp)==sy[pa].end())
{
dif[pa]++;
sy[pa].insert(tmp);
}
}
for(i=1;i<=n;i++)
if(ma[i]==i)
{
tmp=pr(2,dif[i]);
if(tag[i]==0) tmp--;
ans=ans*tmp%mod;
}
printf("%I64d\n",ans);
} int main()
{
int i,j;
scanf("%d",&n);
init();
for(i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
p[i].id=i;
}
sort(p+1,p+n+1,cmp1);
for(i=1;i<n;i++)
if(p[i].x==p[i+1].x)
addedge(p[i].id,p[i+1].id);
sort(p+1,p+n+1,cmp2);
for(i=1;i<n;i++)
if(p[i].y==p[i+1].y)
addedge(p[i].id,p[i+1].id);
sort(p+1,p+n+1,cmp);
solve();
return 0;
}
Codeforces 871C 872E Points, Lines and Ready-made Titles的更多相关文章
- codeforces 872E. Points, Lines and Ready-made Titles
http://codeforces.com/contest/872/problem/E E. Points, Lines and Ready-made Titles time limit per te ...
- Codeforces Round #440 (Div. 1, based on Technocup 2018 Elimination Round 2) C - Points, Lines and Ready-made Titles
C - Points, Lines and Ready-made Titles 把行列看成是图上的点, 一个点(x, y)就相当于x行 向 y列建立一条边, 我们能得出如果一个联通块是一棵树方案数是2 ...
- 【题解】Points, Lines and Ready-made Titles Codeforces 871C 图论
Prelude 真是一道好题,然而比赛的时候花了太多时间在B题上,没时间想这个了QAQ. 题目链接:萌萌哒传送门(.^▽^) Solution 观察样例和样例解释,我们发现,假如有四个点,恰好占据在某 ...
- Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/870/E 题意: 给出平面坐标系上的n个点. 对于每个点,你可以画一条经过这个点的横线或竖线或什么都不画. ...
- Codeforces 870E Points, Lines and Ready-made Titles 计数
题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...
- codeforces 19D D. Points 树套树
D. Points Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/19/problem/D De ...
- Codeforces 593B Anton and Lines
LINK time limit per test 1 second memory limit per test 256 megabytes input standard input output st ...
- R语言:多个因变量时,如何在plot函数中画多条曲线(plot,points,lines,legend函数)
最近阅读一篇文献<Regional and individual variations in the function of the human eccrine sweat gland>, ...
- CodeForces - 1047B Cover Points
B. Cover Points time limit per test1 second memory limit per test256 megabytes inputstandard input o ...
随机推荐
- [转帖]docker容器保持运行不退出
docker容器保持运行不退出 2019年01月20日 23:21:22 chvalrous 阅读数 1511 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- ES简介及特点
1.ES是什么? ES是一个高度可伸缩的开源的全文检索和分析引擎,它允许你以近实时的方式快速存储.搜索.分析大量数据,ES是基于Lucence开发,隐藏其复杂性,提供了简单易用的restful api ...
- Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07
目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Aj ...
- Python学习7——异常
编写程序时,通常能够区分正常和异常情况.为了处理这些异常,可在每个可能出现异常的地方都使用上条件语句,但这样大大降低了程序的可读性,那么怎么解决哪?Python提供强大的替代解决方案——异常处理机制. ...
- nginx-host
下载nginx镜像 docker pull docker.io/nginx:latest 由于calico网络不支持http协议,所以即使你在iptables中配置了nat路由,将访问宿主机80端口的 ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
原文:使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)--第1部分 原文链接:https://www.codeproject.com/Articles/5160941/ASP- ...
- 初识python之了解程序设计基本方法
对于用计算机解决一些问题,这里有一个程序设计的基本方法,主要分为六个步骤,其分析和实现过程如下: (1)分析问题:利用计算机解决问题需要结合计算机技术的发展水平和人类对问题的思考程度,在特定技术和社会 ...
- Windows 7 系统下显示文件类型的扩展名和隐藏文件
一.显示扩展名 点击开始菜单 在搜索框中输入「文件夹选项」并单击 切换到「查看」栏,取消勾选「隐藏已知文件类型的扩展名」这一项 设置完成 ps: 你也可以通过单击下图位置进行相应操作来达到同样的效果 ...
- WebApi 跨域解决方案 --CORS
跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...
- ActiveMQ基础简介
1. 什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 ...