Codeforces Round #243 (Div. 1)——Sereja and Squares
- 题意:
给n个点,求能组成的正方形的个数。四边均平行与坐标轴
- 大神的分析:
经典题
我们考虑每一种x坐标,显然仅仅有<= sqrt{N}个x坐标出现了> sqrt{N}次,我们称这些为大的,其它为小的。我们先考虑大的x和其它x之间的答案,先O(sqrt{N})枚举一个大的坐标,然后for其它的每一个点,这样能够依据x坐标的差算出正方形的边长,hash检查一下就能知道这个正方形是否存在。
之后考虑小的x和小的x之间的答案,注意到我们能够对每一个横坐标直接平方for,这样仅仅有(sqrt{N})^2 + (sqrt{N})^2 + ... + (sqrt{N})^2 = N^1.5的枚举量,之后也能够hash检查。
O(N^1.5)
const int MAXN = 100001; vector<int> vt[MAXN];
bool match(int ind, int val)
{
if (ind >= MAXN) return false;
return binary_search(all(vt[ind]), val);
} int main()
{
// freopen("in.txt", "r", stdin);
int n, a, b, bound;
while (~RI(n))
{
REP(i, MAXN) vt[i].clear();
bound = (int)sqrt(n * 1.0); REP(i, n)
{
RII(a, b);
vt[a].push_back(b);
}
REP(i, MAXN)
{
sort(all(vt[i]));
}
LL ans = 0;
REP(i, MAXN)
{
if (vt[i].size() > bound)
{
FF(j, i + 1, MAXN)
{
int dis = j - i;
REP(k, vt[j].size())
{
int val = vt[j][k];
if (match(j, val + dis) && match(i, val) && match(i, val + dis))
ans++;
}
}
}
else
{
REP(j, vt[i].size()) FF(k, j + 1, vt[i].size())
{
int dis = vt[i][k] - vt[i][j];
if (match(i + dis, vt[i][k]) && match(i + dis, vt[i][j]))
ans++;
}
}
}
cout << ans << endl;
}
return 0;
}
Codeforces Round #243 (Div. 1)——Sereja and Squares的更多相关文章
- Codeforces Round #243 (Div. 2)——Sereja and Swaps
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012476429/article/details/24665103 题目链接 题意: 给定一个整数 ...
- Codeforces Round #243 (Div. 2)——Sereja and Table
看这个问题之前,能够先看看这个论文<一类算法复合的方法>,说白了就是分类讨论,可是这个思想非常重要 题目链接 题意: 首先给出联通块的定义:对于相邻(上下和左右)的同样的数字视为一个联通块 ...
- Codeforces Round #243 (Div. 1)——Sereja and Two Sequences
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012476429/article/details/24798219 题目链接 题意:给两个长度分别 ...
- Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 解读
http://codeforces.com/contest/426/problem/B 对称标题的意思大概是.应当指出的,当线数为奇数时,答案是线路本身的数 #include<iostream& ...
- Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力
A. Sereja and Swaps time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps
由于n比较小,直接暴力解决 #include <iostream> #include <vector> #include <algorithm> #include ...
- Codeforces Round #243 (Div. 2) B. Sereja and Mirroring
#include <iostream> #include <vector> #include <algorithm> using namespace std; in ...
- Codeforces Round #243 (Div. 2) A. Sereja and Mugs
#include <iostream> #include <vector> #include <algorithm> #include <numeric> ...
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps(优先队列 暴力)
题目 题意:求任意连续序列的最大值,这个连续序列可以和其他的 值交换k次,求最大值 思路:暴力枚举所有的连续序列.没做对是因为 首先没有认真读题,没看清交换,然后,以为是dp或者贪心 用了一下贪心,各 ...
随机推荐
- C++基类与派生类的转换
具体表现在以下几个方面: 派生类对象可以向基类对象赋值. 可以用子类(即公用派生类)对象对其基类对象赋值.如 A a1; //定义基类A对象a1 B b1; //定义类A的公用派生类B的对 ...
- H264格式(转)
名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片 : 每个图象中,若干宏块被排列成片的形式.片分为 ...
- 记录vim经常使用的几个命令
vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器. $ vim 1.txt 以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左 ...
- PHP错误捕获处理
PHP错误捕获处理 一般捕获错误使用的方法是: try{ ...}catch(Exception $e){ echo $e->getMessage();} 或者 set_exception_ha ...
- libstdc++.so.6: version `GLIBCXX_3.4.20' not found
libstdc++.so.6: version `GLIBCXX_3.4.20' not found 参考链接: (1)解决/usr/lib/libstdc++.so.6: version `GLIB ...
- 开发使用mysql的一些必备知识点整理(三)高级
简介 实体与实体之间有3种对应关系,这些关系也需要存储下来 在开发中需要对存储的数据进行一些处理,用到内置的一些函数 视图用于完成查询语句的封装 事务可以保证复杂的增删改操作有效 关系 创建成绩表sc ...
- hdu 4506(数学,循环节+快速幂)
小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Android Q 兼容那些事
文章微信公众号「AndroidTraveler」首发 5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法. 会议主要是加深开发者对 Android Q ...
- Java1.8新特性——接口改动和Lambda表达式
Java1.8新特性——接口改动和Lambda表达式 摘要:本文主要学习了Java1.8的新特性中有关接口和Lambda表达式的部分. 部分内容来自以下博客: https://www.cnblogs. ...
- jar word 模板操作比较好用的工具
个人觉得比较好用的java word 模板 http://deepoove.com/poi-tl/