题意:给出二维平面的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!相关推荐

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

  2. AtCoder Beginner Contest 204 F Hanjo 2

    AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...

  3. AtCoder Beginner Contest 170 F. Pond Skater

    AtCoder Beginner Contest 170 F. Pond Skater 题目链接 第一次碰到会写的 F,真的哭辽/(ㄒoㄒ)/~~,BFS+剪枝 题目有几个坑点: 1.初始化,我们直接 ...

  4. AtCoder Beginner Contest 167 F.Bracket Sequencing

    AtCoder Beginner Contest 167 F.Bracket Sequencing 题目链接 判断括号匹配的字符串问题~ 首先给出的所有字符串的左右括号数是要匹配的,这个很好判断,用一 ...

  5. AtCoder Beginner Contest 187 F.Close Group Editorial

    AtCoder Beginner Contest 187 F.Close Group Editorial 题目链接 状压DP~ 如果对边暴力的话复杂度约为 21502^{150}2150,显然不可取, ...

  6. AtCoder Beginner Contest 194 F - Digits Paradise in Hexadecimal 数位dp

    传送门 文章目录 题意: 思路: 题意: 给一个161616进制的串NNN,让你求1−N1-N1−N中有多少个数有kkk个不同的数且没有前导零. 思路: NNN很大,有2e52e52e5了,那么就比较 ...

  7. AtCoder Beginner Contest 192 F - Potion 背包dp

    传送门 题意: 给你nnn个数,让后让你选出来kkk个AAA,把他们求和,之后再递增kkk直到正好达到xxx,求最小的递增次数. 思路: 转化一下题意就是求∑A=x(modlen)\sum A=x(\ ...

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

  9. AtCoder Beginner Contest 187 F - Close Group

    https://atcoder.jp/contests/abc187/tasks/abc187_f 有点像小米决赛的G题啊,所以就秒了 dp[i]表示i这个状压状态,最少可以是多少连通块组成 先预处理 ...

最新文章

  1. C语言中的scanf()函数介绍
  2. 转-Redis学习手册(目录)
  3. IM与工作信息流整合
  4. KnockOut绑定
  5. 私聊模式的设计与实现
  6. mysql优化学习(二)
  7. cocos2d-x plist使用
  8. Linux C/C++ 如何输出彩色字体
  9. Java旧版不断发展
  10. 初识 ::after
  11. tableView编辑
  12. ubuntu cmakelists 配置海康 SDK
  13. Openstack版本查看
  14. 九宫格C语言递归程序,九宫格程序代码 共享并希望大家多提意见
  15. Intellij Idea配置提高速度
  16. 六一儿童节就要过去了,您是否因为工作忙绿而没办法陪孩子玩
  17. 数独计算机在线,js数独计算器
  18. 大学生职业规划8000字_大一职业规划书8000字
  19. 华为无线portal服务器,portal服务器配置
  20. golang监控服务器性能,go 性能监控神器

热门文章

  1. Linux cp 命令的15个示例 - 创建文件和目录的副本
  2. str()和repre()的区别
  3. capwap学习笔记——capwap的前世今生(转)
  4. “我来管管看”系列:如何提高生产计划的实际执行率?
  5. mysql-proxy完成mysql读写分离
  6. 删除windows隐藏的本地连接
  7. ServiceMix部署自定义开发程序(ActiveMQ和Kafka实现)
  8. Errors were encountered while processing 解决方法
  9. ubuntu云主机上Flask+uwsgi+Nginx配置
  10. python2.7调用mysql存储过程并且返回结果