codeforces 425D
题意:给定n<=100000个二维点,并且0<=x,y<=100000,求有多少个平行于坐标轴的正方形
思路:本来想hash的,但是感觉不好弄。。
后来感觉像是分块,最坏的情况就是那种x,y点稠密在一起的情况,并且x与y大致相同的情况下答案最多。。
然后就想到了跟分块很像的暴力。
对于每个点,用vx[x]记录有p.x==x的点的y,用vy[y]记录p.y==y的x
那么对于每个vx[], vy[]排序。。
接着对于每个点我们统计以它为右上角的正方形。。
那么对于每个点(x, y),我们二分查找x处于vy[y]的位置ty,我们二分查找y处于vx[x]的位置tx
那么如果tx<ty,我们直接统计vx[x][0]~vx[x][tx-1]的所有y是否有符合的
每次判断可以通过使用二分查找其他点是否存在。。
如果tx>=ty则统计vy[y][0]~vy[y][ty-1]的所有y是否符合。方法类似。
这样最坏情况下应该跟分块的复杂度差不多吧(不会证明)
code:
#include <bits/stdc++.h>
#define M0(x) memset(x, 0, sizeof(x))
#define MP make_pair
#define PB push_back
#define repf(i, a, b) for (int i = (a); i <= (b); ++i)
using namespace std;
#define x first
#define y second
const int maxn = ;
pair<int, int> p[maxn];
vector<int> vx[maxn], vy[maxn];
int n, m; void solve(){
int mx = , my = ;
repf(i, , n){
scanf("%d%d", &p[i].x, &p[i].y);
mx = max(p[i].x, mx);
my = max(p[i].y, my);
}
repf(i, , mx) vx[i].clear();
repf(i, , my) vy[i].clear();
repf(i, , n){
vx[p[i].x].PB(p[i].y);
vy[p[i].y].PB(p[i].x);
}
repf(i, , mx) sort(vx[i].begin(), vx[i].end());
repf(i, , my) sort(vy[i].begin(), vy[i].end());
int ans = ;
int tx, ty, x, y, t2, t3, d, nx, ny;
repf(i, , n){
x = p[i].x, y = p[i].y;
tx = lower_bound(vx[x].begin(), vx[x].end(), y) - vx[x].begin();
ty = lower_bound(vy[y].begin(), vy[y].end(), x) - vy[y].begin();
if (tx < ty){
t2 = ty;
for (int j = tx-; j >= ; --j){
d = y - vx[x][j];
nx = x - d;
t2 = lower_bound(vy[y].begin(), vy[y].end(), nx) - vy[y].begin();
if (vy[y][t2] == nx){
t3 = lower_bound(vx[nx].begin(), vx[nx].end(), vx[x][j]) - vx[nx].begin();
if (vx[nx][t3] == vx[x][j]) ++ans;
}
}
continue;
}
// t2 = tx;
for (int j = ty-; j >= ; --j){
d = x - vy[y][j];
ny = y - d;
t2 = lower_bound(vx[x].begin(), vx[x].end(), ny) - vx[x].begin();
if (vx[x][t2] == ny){
t3 = lower_bound(vy[ny].begin(), vy[ny].end(), vy[y][j]) - vy[ny].begin();
if (vy[ny][t3] == vy[y][j]) ++ans;
}
}
}
cout << ans << endl;
} int main(){
// freopen("a.in", "r", stdin);
// freopen("a.out", "w", stdout);
while (scanf("%d", &n) != EOF){
solve();
}
return ;
}
codeforces 425D的更多相关文章
- codeforces 425D Sereja and Squares n个点构成多少个正方形
输入n个点,问可以构成多少个正方形.n,xi,yi<=100,000. 刚看题的时候感觉好像以前见过╮(╯▽╰)╭最近越来越觉得以前见过的题偶尔就出现类似的,可是以前不努力啊,没做出来的没认真研 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- [转载]:Fortran字符串的故事
一. Fortran 字符串与 C 字符串的区别 Fortran的字符串处理能力其实很弱,关于字符串的语法还很落后.它与 C 字符串最大的区别就是:Fortran字符串是固定长度的,没有 \0 结束 ...
- entityframework 入门-来自微软
必备条件 要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012. 如果使用的是 Visual Studio 2010,还需要安装 NuGet. 1.创 ...
- html嵌套表格示例
常用嵌套表格示例,出自<网页开发手记:HTML+CSS+JavaScript实战详解> <html> <head> <title>嵌套表格布 ...
- 网站实现特定某个地区访问执行跳转(js方法)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c#基础-类型基础深入了解
对象类型需要动态内存,基础类型需要静态内存 动态内存分配在堆上,静态内存分配在栈上. 静态内存保存着简单的变量,如 int a=0; 值类型:把一个值类型赋值给另外一个值类型,改变其中一个另外一个不会 ...
- VC++ 将IP字符串转为 DWORD值
CString strIP="192.168.1.184"; DWORD dwAddress= ntohl( inet_addr(strIP)); m_IPAddr.SetAddr ...
- delphi对象赋值
Delphi的对象之间赋值主要要注意几个方面的问题: 1.对象之间的 :=赋值只是地址赋值,即是将当前对象的地址赋值到变量中,定义的变量可以是不用初始化的,在内存中两个变量指向的是同一地址空间: ...
- DataGridView控件“至少有一列没有单元格模板”问题处理
这个问题一般是没有设置单元格模板造成的. mdgv.Columns[].CellTemplate = new DataGridViewTextBoxCell();
- input按钮事件的一个隐藏bug,分享出来
我的页面有一个input按钮: <input name="Delete" type="button" value="Delete" c ...
- 同一web系统,不同端口的跨域问题
部署web系统的时候,发现了跨域问题,子系统是用Iframe嵌入到系统里面的,导致父窗口获取子系统的webService和图片时发现跨域问题,如下图所示:问题1:父窗口获取子系统的对象跨域 原因:用这 ...