Gym - 100920H 2010-2011 OpenCup IX Onsite, II Yandex Summer School H.Squares 暴力
2024-08-31 01:07:01
题意:有10w个点,问你选4个点,能组成平行于坐标轴的正方形有多少个
题解:不知道正解,我的做法就是暴力的基础上优化一点,每次按x排好序,每次枚举的2个点都是x相同的
这样算是个优化?但并不能过,因为可能一列全是x相同的,于是又判了一次对于这个点,x相同的多还是y相同的多
具体实现用了个set没想到就过了
#include<bits/stdc++.h>
using namespace std;
#define N 2000006
set<int>x[N],y[N];
int n,a[N],b[N],ans=;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
a[i]+=1e6;b[i]+=1e6;
x[a[i]].insert(b[i]);
y[b[i]].insert(a[i]);
}
for (int i=;i<=n;i++)
{
if (x[a[i]].size()<y[b[i]].size())
{
set<int>::iterator it=x[a[i]].upper_bound(b[i]);
while (it!=x[a[i]].end())
{
int l=*it-b[i];
if (a[i]+l<N)
if (x[a[i]+l].find(b[i]+l)!=x[a[i]+l].end() && x[a[i]+l].find(b[i])!=x[a[i]+l].end()) ans++;
it++;
}
}else
{
set<int>::iterator it=y[b[i]].upper_bound(a[i]);
while (it!=y[b[i]].end())
{
int l=*it-a[i];
if (b[i]+l<N)
if (y[b[i]+l].find(a[i]+l)!=y[b[i]+l].end() && y[b[i]+l].find(a[i])!=y[b[i]+l].end()) ans++;
it++;
}
}
}
cout<<ans<<endl;
}
最新文章
- ScrollView中嵌套GridView,ListView只显示一行的解决办法
- 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式
- KEIL MDK STM32如何建立工程
- linux 下 文件权限和文件主
- jstl long类型数据转换为日期格式
- static class - 静态类
- kafka 的 createDirectStream
- Redis in Docker on Linux Container
- mybatis_SQL映射(4)鉴别器
- 南阳OJ-6-喷水装置(一)
- vue-输入框change事件并获取值
- 先安装VS后安装IIS,注册IIS方法
- 《FPGA全程进阶---实战演练》第七章 让按键恢复平静
- 给PHP开启shmop扩展实现共享内存
- C# 初学
- c++ 指定长度容器元素的拷贝(copy_n)
- iOS开发值得收藏的博客
- Java解决LeetCode72题 Edit Distance
- Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。
- MySQL5.7 添加、删除用户与授权