JNUOJ 1187 - 哨兵

题目链接:http://jnuacm.club:8080/oj/problem_show.php?pid=1187

Time Limit: 10000ms

Memory Limit: 262154KB

64-bit integer IO format: %lld      Java class name: Main

木衫同学和凌小小都是军队的指挥官,他们共同管理着一队哨兵,每个哨兵都有一个位置(x,y)。但是木衫同学和凌小小计算距离的方法不一样,木衫同学计算第i个人和第j个人的距离利用以下公式 |xi - xj| + |yi - yj|,而凌小小计算时利用以下公式sqrt( (xi-xj)^2+(yi-yj)^2 )。现在问有多少组哨兵,他们之间的距离运用两种公式计算出来的结果是一样的。

Input

第一行输入一个整数T,代表有T组数据
每组数据第一行输入n(1?≤?n?≤?200000),代表哨兵的个数。
下面的n行,每行有两个整数,代表当前哨兵的坐标,(|xi|,?|yi|?≤?10^9)。

Output

每组数据输出一行,这一行只有一个整数,即符合条件的哨兵的组数。

Sample Input

2
3
1 1
7 5
1 5
6
0 0
0 1
0 2
-1 1
0 1
1 1

Sample Output

2
11
单纯暴力当然是要超时的……其实满足|xi - xj| + |yi - yj| = sqrt( (xi-xj)^2+(yi-yj)^2 )的两个点,只能是在同一条水平线或者同一条竖直线上

所以可以把不用计算两个距离,而是通过判断是否在同一条水平线或者同一条竖直线上来判断是否满足|xi - xj| + |yi - yj| = sqrt( (xi-xj)^2+(yi-yj)^2 )
 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstdlib>
 4 long long ans;
 5 int n;
 6 struct type{
 7     double x,y;
 8 }p[200000+5];
 9 bool check(type a,type b)
10 {
11     if(a.x == b.x || a.y == b.y) return true;
12     return false;
13 }
14 int main()
15 {
16     int t;
17     scanf("%d",&t);
18     while(t--)
19     {
20         scanf("%d",&n);
21         for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
22         ans=0;
23         for(int i=1;i<n;i++)
24         {
25             for(int j=i+1;j<=n;j++)
26             {
27                 if(check(p[i],p[j])) ans++;
28             }
29         }
30         printf("%lld\n",ans);
31     }
32 }

这大概要耗时4秒左右。

所以可以考虑把用map把出现过的水平线(y=k的k作为key值)或者竖直线记录下来(x=k的k作为key值),然后把出现过的两个哨兵在相同的点上的情况也记录下来,

这样,每输入一个哨兵的坐标,ans+= “与他在同一条水平线上的人” + “与他在同一条竖直线上的人” - “与他在同一个坐标上的人(因为这样的人重复算了两次)”

 1 #include<cstdio>
 2 #include<map>
 3 using namespace std;
 4 typedef long long ll;
 5 pair<ll,ll> now;
 6 map<ll,ll> a,b;
 7 map<pair<ll,ll>,ll> same;
 8 int n;
 9 ll ans,x,y;
10 int main()
11 {
12     int t;
13     scanf("%d",&t);
14     while(t--)
15     {
16         a.clear();b.clear();same.clear();
17         ans=0;
18         scanf("%d",&n);
19         for(int i=1;i<=n;i++)
20         {
21             scanf("%d%d",&x,&y);
22             ans=ans+a[x]+b[y]-same[make_pair(x,y)];
23             a[x]++;
24             b[y]++;
25             same[make_pair(x,y)]++;
26         }
27         printf("%d\n",ans);
28     }
29 }

这样耗时大概是1秒左右。

时间: 2024-10-16 14:38:16

JNUOJ 1187 - 哨兵的相关文章

Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制

在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用. 这篇博客所介绍的文章所考虑的是生成caption时的与视觉信息无关的词的问题,如"the"."of"这些词其实和图片内容是没什么关系的:而且,有些貌似需要视觉特征来生成的词,其实也可以直接通过语言模型来预测出来,例如"taking on a cell"后生成"phone".

深入浅出Redis-redis哨兵集群

1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器. 例如: 在Server1 掉线后: 升级Server2 为新的主服务器: 2.Redis 主从分离 在讲解Sentinel 哨兵集群之前,我们先来搭建一个简单的主从分离(读写分离). 首先,我们

redis哨兵模式

前面总结了redis的主从复制,实现了读写分离,但是这种模式存在了一定的弊端,例如主机宕机后,从机就失去了存在的意义,因为从机无法反客为主,实现对外提供服务.需要人工手动操作.而redis的哨兵模式可以实现当主机宕机后,从机根据投票模式,票数多的自动切换成主机.下面总结一些如何进行配置. (1)首先还是准备3台服务器,ip分别为192.168.0.101(主机), 192,168.0.102, 192.168.0.104. (2)先配置好主从复制,使用命令slaveof host post,如下

Redis集群redis主从自动切换Sentinel(哨兵模式)

Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave3):Master-Slave切换后,master_redis.conf.slave_redis.conf和sentinel.conf的内容都会发生改变,即mast

jedis支持哨兵主从配置role为slave

jedis功能强大,但是不能像nodejs一样指定从slave中读数据,使数据量读写量较大时读写分离,减少redis压力. 我们可以利用jedis中的方法封装一个类似于此的方法. github地址: https://github.com/candyleer/jedis-enhance 使用方法如: 指定masterName名称,sentinels 地址,并定义一个连接池,初始化后可以从中获取一个jedis连接,支持哨兵的master切换后重新选举合适的slave,如果当前连接的slave挂了,需

hihoCoder 1187

今天BC爆0了....但是日子还是要过的....要回学校毕业了~~大学就这么“荒废”了. 这个是hihoCoder的1187,比较基础的一道题. 题目链接: http://hihocoder.com/problemset/problem/1187 首先我们想,任何一个数可以质因数分解,且分解的方法唯一. n = (p1 ^ k1) * (p2 ^ k2) * .... * (ps ^ ks) 约数(n) = (k1+1)*(k2+1)*(k3+1)* .... *(ks+1) 那么剩下的问题就简

redis主从+哨兵模式

主从模式配置分为手动和配置文件两种方式进行配置,我现在有192.168.238.128(CentOS1).192.168.238.131(CentOS3).192.168.238.132(CentOS4)几台机器,只是配置文件的配置方式是降手动配置的命令放在配置文件中而已,本质是一致的.下面将对配置文件方式进行配置,我所述的案例,是基于我自己的另一篇博文<Redis的安装.服务配置>之上: 1.我将CentOS4作为主数据库,其他 模拟为从数据库 2.将CentOS1目录切换到/etc/red

基于线性表的哨兵查找和折半查找

#include<stdio.h>typedef int KeyType;#define LIST_SIZE 20typedef struct RecordType{ KeyType key; //OtherType other_data;}RecordType; typedef struct RecordList{ RecordType r[LIST_SIZE+1]; int length;}RecordList; void Init(RecordList *l,KeyType k){ l-

StackExchange.Redis客户端读写主从配置,以及哨兵配置。

今天简单分享一下StackExchange.Redis客户端中配置主从分离以及哨兵的配置. 关于哨兵如果有不了解的朋友,可以看我之前的一篇分享,当然主从复制文章也可以找到.http://www.cnblogs.com/tdws/tag/NoSql/ 为什么要有这篇分享呢,是因为我之前也有一些疑问,相信学习Redis的朋友都有过相同的疑问. 在代码中,如何分别操作主从数据库?,也就是说,如何只向主数据库写,而读取只向从服务器读.我目前给出的解决方案就是有关Set命令使用主服务器地址,关于Get的命