HDU 4631 set维护

简介:

题意:给出n有n个点,每次插入计算最小点对距离,然后把距离和求出来。

用multiset按x坐标大小维护就行了。14s 

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
struct point
{
    long long x,y;
    bool operator < (const point &m) const
    {
        if(x==m.x)
            return y<m.y;
        return x<m.x;
    }
};
multiset<point> myset;
multiset<point>::iterator it,i1,i2;
long long dis(point a,point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
long long getmin(long long m,point a)
{
    long long ans=m;
    it=myset.lower_bound(a);
    for(i1=it; i1!=myset.end(); i1++)
    {
        long long dx=a.x-i1->x;
        if(dx*dx>=ans)
            break;
        long long dy=a.y-i1->y;
        ans=min(ans,dx*dx+dy*dy);
    }
    for(i1=it; i1!=myset.begin();)
    {
        i1--;
        long long dx=a.x-i1->x;
        if(dx*dx>=ans) break;
        long long dy=a.y-i1->y;
        ans=min(ans,dx*dx+dy*dy);
    }
    myset.insert(a);
    return ans;
}
int main()
{
    int t,n;
    long long ax,ay,bx,by,cx,cy,ans,m;
    scanf("%d",&t);
    while(t--)
    {
        myset.clear();
        scanf("%d%I64d%I64d%I64d%I64d%I64d%I64d",&n,&ax,&bx,&cx,&ay,&by,&cy);
        point a;
        a.x=bx%cx,a.y=by%cy,ans=0;
        m=1e18;
        myset.insert(a);
        for(int i=1; i<n; i++)
        {
            a.x=(a.x*ax+bx)%cx,a.y=(a.y*ay+by)%cy;
            m=getmin(m,a);
            ans+=m;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}



目录
相关文章
hdu 1558 Segment set
点击打开hdu 1558 思路: 计算几何+并查集 分析: 1 有n个操作,最后求有几个集合或者说是连通分量 2 对于输入一条线段我们就去前面找能够和它相交的线段,利用并查集进行合并并且更新rank数组,rank[x]数组保存的是以x为跟...
767 0
|
7天前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
12 1
|
12天前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
|
6天前
|
Go
go语言map、实现set
go语言map、实现set
13 0
|
6天前
|
存储 消息中间件 算法
Java中的集合框架详解:List、Set、Map的使用场景
Java中的集合框架详解:List、Set、Map的使用场景
|
6天前
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
13 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
11天前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
13 3
|
13天前
|
存储 编译器 C++
|
21天前
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。