hdu 4311 Meeting point-1 递推 多校联合赛(二) 第二题
这道提看完yy是最小生成数,一看点100000个,顿时吓尿了,最短路对校生成树都要n^2什么的啊,所以所以,没做出来
了解他的行走模式就知道,其实我们是可以x,y分开算的,这是什么概念,排序之后就是在x轴上可以分别算出每个点到其他距离和sumx,y轴上可以分别算出每个点到其他距离和sumy,对于询问的(x,y),可以二分查找到他在x轴上对应的sumx,y轴上对应sumy,在sumx+sumy就ok啦!!
至于我们怎么找算sumx,sumy,如果挨个算那就又是n^2啦,不好,想一个办法,就是递推先算出第一个点到说有点的距离sumx[1],然后就递推了,因为我们想右递推的过程中,里右面的点越来越进,左面的点越来越远,sumx[i]向sum[i+1]移动,远了左面点的个数*a[i+1]-a[i](从小到大排序的),近了右面点的个数*a[i+1]-a[i],所以递推公式为sumx[i]=sumx[i-1]-(long long)(m-i)*(a[i]-a[i-1])+(long long)i*(a[i]-a[i-1]);注意中间会溢出的
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
long long sumx[N],sumy[N];
int a[N],b[N],aa[N],bb[N],m;
long long find1(int x){int l=0,r=m-1;while(r>=l){int mid=(l+r)>>1;if(x>a[mid])l=mid+1;if(x<a[mid])r=mid-1;if(x==a[mid])return sumx[mid];}return sumx[l];
}
long long find2(int x){int l=0,r=m-1;while(r>=l){int mid=(l+r)>>1;if(x>b[mid])l=mid+1;if(x<b[mid])r=mid-1;if(x==b[mid])return sumy[mid];}return sumy[l];
}
int main(){freopen("in.txt","r",stdin);int n,x,y;scanf("%d",&n);while(n--){scanf("%d",&m);for(int i=0;i<m;i++){scanf("%d%d",&a[i],&b[i]);aa[i]=a[i];bb[i]=b[i];sumx[i]=sumy[i]=0;}sort(a,a+m);sort(b,b+m);for(int i=1;i<m;i++){sumx[0]+=a[i]-a[0];sumy[0]+=b[i]-b[0];}for(int i=1;i<m;i++){sumx[i]=sumx[i-1]-(long long)(m-i)*(a[i]-a[i-1])+(long long)i*(a[i]-a[i-1]);sumy[i]=sumy[i-1]-(long long)(m-i)*(b[i]-b[i-1])+(long long)i*(b[i]-b[i-1]);}
// for(int i=0;i<m;i++)
// cout<<sumx[i]<<" ";// cout<<endl;
// for(int i=0;i<m;i++)
// cout<<sumy[i]<<" ";
// cout<<endl;long long sum,min1=300000000000000LL;// cout<<min1<<endl;for(int i=0;i<m;i++){sum=find1(aa[i])+find2(bb[i]);if(sum<min1)min1=sum;}cout<<min1<<endl;}return 0;
}
hdu 4311 Meeting point-1 递推 多校联合赛(二) 第二题相关推荐
- hdu 1133 Buy the Ticket(递推+精度精算)
做这道题之前可以先做:hdu 1267(递推方法和这道题是一样的知识没有精度计算)这是我的博客链接接:http://www.cnblogs.com/jiangjing/archive/2013/01/ ...
- HDU 5459 Jesus Is Here (递推,组合数学)
有点麻烦的递推,递推的原则:向小的问题方向分解,注意边界. 字符串的递推式为 定义f为Si中的总方案数 首先可以得到 fi=fi-1+fi-2+组合(si-2,si-1) 然后考虑Si-2和Si-1之 ...
- hdu 2046 骨牌铺方格 递推求解
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂/杜教BM)
题目链接:点击查看 题目大意:规定宽度为4,给定长度为n,求用1*2和2*1的瓷砖,将其完全铺满能有多少种方法. 分析:自从学会了矩阵快速幂之后,看到1e18的数据量都会下意识的往递推上面想,但是以前 ...
- hdu 4311 Meeting point-1
http://acm.hdu.edu.cn/showproblem.php?pid=4311 思维呀 亲 你想到就可以做出来 想不到就做不出了 什么都不说了 上代码 不知道为什么 在hdu 上 ...
- HDU 4311 - Meeting point-1(前缀和优化曼哈顿距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4311 题意:给定n个点,找出一点使得该点到其余各点的曼哈顿距离总和最小,输出最小值. 思路:分别对横纵 ...
- HDU 2046 骨牌铺方格 递推
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
题目:传送门. #include <iostream> #include <algorithm> #include <cstdio> #include <cs ...
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去 2 ...
- HDU多校联合赛(1007 Magical Forest)模拟题
题目: Problem Description There is a forest can be seen as N * M grid. In this forest, there is some m ...
最新文章
- leetcode算法题--Minimum Number of Arrows to Burst Balloons
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- 【Android学习】自定义Android样式checkbox
- ref 与 out 参数的区别
- Ubuntu下添加开机启动脚本
- 一款黑科技让普通屏幕秒变触摸屏,厉害了我的哥
- 基于CNN实现CIFAR100识别-tensorflow2.0实现
- cf414B(dp)
- 接口测试---mock变量自定义变量的使用
- asp.net 用正则表达式过滤内容中的电话,qq,email
- ABAP中分页控件的定义
- 百度谭中意:我和开源20年
- 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别
- jenkins 国内插件源无效问题的解决方案
- AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
- Python 使用 PyOTP 实现二步验证
- MT7921:WIFI、AP、BT基础知识
- 用手机远程控制扫描仪
- Arthas Spring Boot Starter工程启动报错
- mac book 华为C8815不能debug