Prelude

真是一道好题,然而比赛的时候花了太多时间在B题上,没时间想这个了QAQ。

题目链接:萌萌哒传送门(。^▽^)


Solution

观察样例和样例解释,我们发现,假如有四个点,恰好占据在某一个矩形的四个顶点上,那么这个矩形的四条边,都是可以自由选择画或者不画的。

这时候,我们称这四个点每个点“控制”了四条直线中的一条,可以自由选择这条直线画或者不画。这里可以配合样例解释理解一下。

考虑建立常用的图论模型——行列模型,把每一行抽象成一个点,每一列抽象成一个点,假如在\((x,y)\)处有一个点,那么用一条边连接第\(x\)行和第\(y\)列所代表的点。

在这个图上,每条边可以选择“控制”她所连接的两个点中的一个。

再次观察样例,发现如果四个点恰好占据在一个矩形的四个顶点上,那么这个连通块内会有一个环。

紧接着我们发现,如果在建出来的图上,某个连通块内有一个环的话,那么这个连通块内的每一个点,都可以被一条边“控制”,并且这些边不会重复。

也就是说,这个连通块内的每一个点所代表的直线,都是可以自由选择画或者不画的,因此,假设这个连通块内的点数为\(n\),则这个连通块内的方案数为\(2^{n}\)。

假如某一个连通块内没有环,即形成了一棵树,那么容易发现,只有“所有直线都画”这一种情况没法办到,因此,方案数为\(2^{n}-1\)。

根据乘法原理,每个连通块之间互不干扰,所以把每个连通块的方案数乘起来就好了。


Code

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <map>
#include <cctype>
#include <queue> using namespace std;
typedef long long ll;
const int MAXN = 200010;
const int MOD = 1e9+7; int read() {
int x = 0, ch;
while( isspace(ch = getchar()) );
do x = x * 10 + ch - '0';
while( isdigit(ch = getchar()) );
return x;
} int n;
map<int,int> idx, idy;
int nid; namespace G {
int head[MAXN], nxt[MAXN], to[MAXN], m;
void init() {
memset(head, -1, sizeof head);
}
void adde( int u, int v ) {
to[m] = v, nxt[m] = head[u], head[u] = m++;
to[m] = u, nxt[m] = head[v], head[v] = m++;
}
} int fpow( int a, int b ) {
int c = 1;
while(b) {
if( b & 1 ) c = int(1LL * c * a % MOD);
a = int(1LL * a * a % MOD);
b >>= 1;
}
return c;
} int vis[MAXN];
queue<int> q;
int solve( int s ) {
using namespace G;
int e = 0, o = 0; // 边数和点数
vis[s] = 1, q.push(s);
while( !q.empty() ) {
int u = q.front(); q.pop();
++o;
for( int i = head[u]; ~i; i = nxt[i], ++e )
if( !vis[to[i]] )
vis[to[i]] = 1, q.push(to[i]);
}
e >>= 1;
return e == o-1 ? (fpow(2, o) - 1 + MOD) % MOD : fpow(2, o);
} int main() {
n = read();
G::init();
for( int i = 0; i < n; ++i ) {
int x = read(), y = read();
if( !idx[x] ) idx[x] = ++nid;
if( !idy[y] ) idy[y] = ++nid;
G::adde(idx[x], idy[y]);
}
int ans = 1;
for( int i = 1; i <= nid; ++i )
if( !vis[i] )
ans = int(1LL * ans * solve(i) % MOD);
printf( "%d\n", ans );
return 0;
}

【题解】Points, Lines and Ready-made Titles Codeforces 871C 图论的更多相关文章

  1. 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 ...

  2. 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 ...

  3. Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】

    题目链接:http://codeforces.com/problemset/problem/870/E 题意: 给出平面坐标系上的n个点. 对于每个点,你可以画一条经过这个点的横线或竖线或什么都不画. ...

  4. Codeforces 870E Points, Lines and Ready-made Titles 计数

    题目链接 题意 给定二维坐标上的\(n\)个点,过每个点可以 画一条水平线 或 画一条竖直线 或 什么都不画,并且若干条重合的直线被看做同一条.问共可能得到多少幅不同的画面? 题解 官方题解 仆の瞎扯 ...

  5. Codeforces 871C 872E Points, Lines and Ready-made Titles

    题 OvO http://codeforces.com/contest/871/problem/C ( Codeforces Round #440 (Div. 1, based on Technocu ...

  6. R语言:多个因变量时,如何在plot函数中画多条曲线(plot,points,lines,legend函数)

    最近阅读一篇文献<Regional and individual variations in the function of the human eccrine sweat gland>, ...

  7. Leaflet入门:添加点线面并导入GeoJSON数据|Tutorial of Leaflet: Adding Points, Lines, Polygons and Import GeoJSON File

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  8. Ant Man CodeForces - 704B (图论,贪心)

    大意: 给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的X坐标可得I到J的距离计算公式 |xi - xj| + ci + bj seconds if j< i |xi - xj| ...

  9. [题解] [NOIP2008] 双栈排序——关系的冲突至图论解法

    Problem 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操 ...

随机推荐

  1. 【python】详解time模块功能asctime、localtime、mktime、sleep、strptime、strftime、time等函数以及时间的加减运算

    在Python中,与时间处理相关的模块有:time.datetime以及calendar.学会计算时间,对程序的调优非常重要,可以在程序中狂打时间戳,来具体判断程序中哪一块耗时最多,从而找到程序调优的 ...

  2. 使用 Sublime Text 做 Javascript 编辑器 - 集成 JSHint 问题检测工具

    JSHint(jshint.com)是 Javascritp 代码质量工具,可以帮助开发人员发现 Javascript 代码中的错误和潜在的问题.jshint.com 是一个在线编辑器,我们可以为 S ...

  3. 使用appcmd命令创建iis站点及应用程序池

    参考文章:iis7 appcmd的基础命令及简单用法 验证环境:Windows 7    IIS7 AppCmd.exe工具所在目录 C:\windows\sytstem32\inetsrv\目录下, ...

  4. Immutable 常用API简介

    本文主要整理了Immutable.js常用API的使用. Immutable 是什么? 关于Immutable的定义,官方文档是这样说的: Immutable data encourages pure ...

  5. winform default模式下和英文模式下 修改问题

    1.修改控件大小.位置等属性在default模式下修改: 2.修改控件属性最好不要做鼠标拖动放大,拖动修改位置等,建议用属性栏中的数字来改变.

  6. DB2 日志

    跟Oracle类似DB2也分为两个模式,日志循环vs归档日志,也就是非归档和归档模式,下面对这两种模式做简单的介绍. 日志循环 日志循环是默认方式,也就是非归档模式,这种模式只支持backup off ...

  7. Redis的sentinel机制(sentinel节点IP为:192.168.23.10) “哨兵”

    万一主节点打击,主从模型将会停止工作,为了解决这个问题,Redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,一旦主节点宕机了,sentinel将会在从节点中挑一个作为主节点.与zo ...

  8. php缩略图

    /*引入文件Easyphpthumbnail.class.php 引用地址:http://www.itdaodan.com/article-detail-id-252.html */   class ...

  9. 51nod 1804 小C的多边形(构造)

    首先可以算出无解的充分不必要条件,所有边的和为sum=3*((n-1)*n)/2,如果sum%n!=0显然无解. 也就是说n为奇数必然无解.现在考虑n为偶数的情况. 不妨假设n为偶数有解,现在考虑如何 ...

  10. BZOJ 2427 软件安装(强连通分量+树形背包)

    题意:现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现在有 ...