AtCoder Beginner Contest 131 F - Must Be Rectangular!
题意:给出二维平面的n个点坐标,定义一种操作:若恰好三个点能形成一个矩形(当然这个矩形会缺了一个点),那么就在图上添加这个缺的点,问在原图上最多能进行几次这样的操作。
解法:这题想了挺久没想到,一看题解发现z自己思路和正解完全不沾边(尴尬)。解法参考https://www.cnblogs.com/zaq19970105/p/11108175.html这位大佬的。我们把x轴看作二分图的左边点,y轴看作二分图右边点,对于原图上的点就向左边点向右边点连边,即二分图一条边就是原图一个点。然后我们先观察四个点能构成矩形有什么特点:如果在二分图上左边任意两个点和任意右边两个点有4条连边就是能构成矩形,那么怎么才是缺一个点呢?基于上面就不难想了,就是左两个点和右两个点只有3条边,那么缺的那一条边就是缺的点。然后接下来这个发现就难一点了,就是如果左两个点右两个点至少有3条边相连,那么这四个点就必须是连通的(而若只有两条边就不会)。那么按原图在二分图进行连边之后就会出现一个个联通块,进行一次题目操作就会在联通块上加一条边,直到加到不能加就是完全二分图为止。那么答案就出来了:就是每个联通块完全图边数-原图已有的边数 ,所有联通块加起来就是答案。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e5+10; 4 typedef long long LL; 5 int n,X,Y; 6 vector<int> G[N],v; 7 bool vis[N]; 8 9 void dfs(int x,int dep) { 10 if (dep%2) X++; else Y++; 11 v.push_back(x); 12 vis[x]=1; 13 for (int i=0;i<G[x].size();i++) { 14 int t=G[x][i]; 15 if (vis[t]) continue; 16 dfs(t,dep+1); 17 } 18 } 19 20 int main() 21 { 22 cin>>n; 23 for (int i=1;i<=n;i++) { 24 int x,y; scanf("%d%d",&x,&y); 25 G[x].push_back(y+100000); 26 G[y+100000].push_back(x); 27 } 28 29 memset(vis,0,sizeof(vis)); 30 LL ans=0; 31 for (int i=1;i<=200000;i++) 32 if (G[i].size() && !vis[i]) { 33 X=0; Y=0; v.clear(); 34 dfs(i,1); 35 LL num=0; 36 for (int j=0;j<v.size();j++) num+=G[v[j]].size(); 37 ans+=(LL)X*Y-num/2; 38 } 39 cout<<ans<<endl; 40 return 0; 41 }
转载于:https://www.cnblogs.com/clno1/p/11224028.html
AtCoder Beginner Contest 131 F - Must Be Rectangular!相关推荐
- AtCoder Beginner Contest 215 F - Dist Max 2
AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi,yi),定义两点(xi,yi),(xj,yj)(x ...
- AtCoder Beginner Contest 204 F Hanjo 2
AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...
- AtCoder Beginner Contest 170 F. Pond Skater
AtCoder Beginner Contest 170 F. Pond Skater 题目链接 第一次碰到会写的 F,真的哭辽/(ㄒoㄒ)/~~,BFS+剪枝 题目有几个坑点: 1.初始化,我们直接 ...
- AtCoder Beginner Contest 167 F.Bracket Sequencing
AtCoder Beginner Contest 167 F.Bracket Sequencing 题目链接 判断括号匹配的字符串问题~ 首先给出的所有字符串的左右括号数是要匹配的,这个很好判断,用一 ...
- AtCoder Beginner Contest 187 F.Close Group Editorial
AtCoder Beginner Contest 187 F.Close Group Editorial 题目链接 状压DP~ 如果对边暴力的话复杂度约为 21502^{150}2150,显然不可取, ...
- AtCoder Beginner Contest 194 F - Digits Paradise in Hexadecimal 数位dp
传送门 文章目录 题意: 思路: 题意: 给一个161616进制的串NNN,让你求1−N1-N1−N中有多少个数有kkk个不同的数且没有前导零. 思路: NNN很大,有2e52e52e5了,那么就比较 ...
- AtCoder Beginner Contest 192 F - Potion 背包dp
传送门 题意: 给你nnn个数,让后让你选出来kkk个AAA,把他们求和,之后再递增kkk直到正好达到xxx,求最小的递增次数. 思路: 转化一下题意就是求∑A=x(modlen)\sum A=x(\ ...
- Caddi Programming Contest 2021(AtCoder Beginner Contest 193) F.Zebraness
题目链接 Problem Statement We have a grid with N horizontal rows and N vertical columns. Let (i,j) denot ...
- AtCoder Beginner Contest 187 F - Close Group
https://atcoder.jp/contests/abc187/tasks/abc187_f 有点像小米决赛的G题啊,所以就秒了 dp[i]表示i这个状压状态,最少可以是多少连通块组成 先预处理 ...
最新文章
- C语言中的scanf()函数介绍
- 转-Redis学习手册(目录)
- IM与工作信息流整合
- KnockOut绑定
- 私聊模式的设计与实现
- mysql优化学习(二)
- cocos2d-x plist使用
- Linux C/C++ 如何输出彩色字体
- Java旧版不断发展
- 初识 ::after
- tableView编辑
- ubuntu cmakelists 配置海康 SDK
- Openstack版本查看
- 九宫格C语言递归程序,九宫格程序代码 共享并希望大家多提意见
- Intellij Idea配置提高速度
- 六一儿童节就要过去了,您是否因为工作忙绿而没办法陪孩子玩
- 数独计算机在线,js数独计算器
- 大学生职业规划8000字_大一职业规划书8000字
- 华为无线portal服务器,portal服务器配置
- golang监控服务器性能,go 性能监控神器
热门文章
- Linux cp 命令的15个示例 - 创建文件和目录的副本
- str()和repre()的区别
- capwap学习笔记——capwap的前世今生(转)
- “我来管管看”系列:如何提高生产计划的实际执行率?
- mysql-proxy完成mysql读写分离
- 删除windows隐藏的本地连接
- ServiceMix部署自定义开发程序(ActiveMQ和Kafka实现)
- Errors were encountered while processing 解决方法
- ubuntu云主机上Flask+uwsgi+Nginx配置
- python2.7调用mysql存储过程并且返回结果