hdu 4311 排序+二分

枚举每个点是必须的,问题就在于如何快速求出曼哈顿距离之和。可以将x坐标和y坐标分别排序,枚举到点(xx,yy)的时候在排好序的x和y数组中二分找到其位置,然后之前的数字都小于,之后的数字都大于,就可以去掉绝对值了。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 typedef long long ll;
 8 const ll INF = 9999999999999999;
 9 const int N = 100000;
10 int x[N];
11 int y[N];
12 ll sumx[N];
13 ll sumy[N];
14 ll ans;
15
16 struct Point
17 {
18     int x, y;
19 } point[N];
20
21 int main ()
22 {
23     int t;
24     scanf("%d", &t);
25     while ( t-- )
26     {
27         int n;
28         scanf("%d", &n);
29         for ( int i = 0; i < n; i++ )
30         {
31             scanf("%d", x + i);
32             scanf("%d", y + i);
33             point[i].x = x[i];
34             point[i].y = y[i];
35         }
36         sort( x, x + n );
37         sort( y, y + n );
38         sumx[0] = x[0];
39         sumy[0] = y[0];
40         for ( int i = 1; i < n; i++ )
41         {
42             sumx[i] = sumx[i - 1] + x[i];
43             sumy[i] = sumy[i - 1] + y[i];
44         }
45         ans = INF;
46         for ( int i = 0; i < n; i++ )
47         {
48             int xx = point[i].x;
49             int yy = point[i].y;
50             int posx = upper_bound( x, x + n, xx ) - x;
51             int posy = upper_bound( y, y + n, yy ) - y;
52             ll tmpx = ( ll ) posx * xx - sumx[posx - 1] + sumx[n - 1]
53             - sumx[posx - 1] - ( ll ) ( n - posx ) * xx;
54             ll tmpy = ( ll ) posy * yy - sumy[posy - 1] + sumy[n - 1]
55             - sumy[posy - 1] - ( ll ) ( n - posy ) * yy;
56             if ( tmpx + tmpy < ans )
57             {
58                 ans = tmpx + tmpy;
59             }
60         }
61         printf("%I64d\n", ans);
62     }
63     return 0;
64 }
时间: 2024-08-09 19:47:18

hdu 4311 排序+二分的相关文章

hdu 5199 Gunner (hash || 排序+二分)

题意:有n个不同高度的树排成一列,树上各有1只鸟. 然后m个询问,每次询问可以打掉h[i](1<=i<=m)高度的所有鸟,问m个询问中的各高度能打掉多少只鸟. 分析: 1.题目给了提示要 “快速读入”  咩~ 2.排序+二分 这里可以两次二分(lower_bound找下界,upper_bound找上界) 也可以合并+二分(合并相同的数字,记录次数) g++提交要用#include<stdio.h> 不要用#include<cstdio> 后者有效率问题,会 tle (⊙

HDU 4311&amp;4312 Meeting point-1&amp;2 (曼哈顿距离&amp;&amp;切比雪夫距离)

HDU 4311 题意:平面上有n个点,一个点(x,y)只能到达(x-1,y), (x+1,y), (x, y-1), (x, y+1)4个点.从n个点中找到一点,使其他点到此点的距离之和最小. 思路: 可以发现,两个点间距离为 |x1-x2| + |y1-y2| ,这便是两点间的曼哈顿距离. 朴素的做法是遍历所有点,枚举该点与其他点间的曼哈顿距离之和,但是会TLE: 取巧的做法是将所有点与中心点的曼哈顿距离排序,枚举中间大概250个点左右的情况比较即可(不要欺负人家数据水! 正确姿势: 用结构

HDU 4311 Meeting point-1 &amp;&amp; HDU 4312 Meeting point-2

这俩个题  题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a(xa,yb),b(xb,yb)的曼哈顿距离是abs(xa-xb)+abs(ya-yb): 看的出来这个距离和x,y 都有关,但是X,Y并不相互影响,所以可以分开计算这样,分开计算的好处如下: 如果 只给一个维度的坐标系 ,我们是不可以再什么养的复杂度的时间内处理出来呢? 大难还是很好想的先排序一下,会发现

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

HDU 1106 排序 其实是字符串分割

Problem Description 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是由若干个'0'组成的,这时这个整数就是0). 你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出. Input 输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000. 输入数据保证:分割得到的非负整数不会大于100000000:输入数据不可能

HDU 4768 Flyer (二分)

OJ题目:click here~~ 题目分析:n个[a  b] 区间,对于i 属于[a  b]  ,从a开始,间隔c ,即i = a , i = a + c , i = a + 2*c -- 将x[ i ] 加1 ,x[ i ] 初值为0 . 已知最多只有一个x[ i ] 为奇数.找到这个i , 和这个奇数. 由于最多只有一个奇数,且奇数 + 偶数 = 奇数.用二分夹逼出这个奇数的位置.找到这个位置,再计算这个奇数就很容易了. AC_CODE const int maxn = 20002; LL

hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)

Mines Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1110    Accepted Submission(s): 280 Problem Description Terrorists put some mines in a crowded square recently. The police evacuate all peo

hdu 2962 Trucking (二分+最短路Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1763    Accepted Submission(s): 618 Problem Description A certain local trucking co