BZOJ 3170 松鼠聚会

日常刷水。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define maxn 100500
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
long long n,idx[maxn],idy[maxn],xs,ys,sumx[maxn],sumy[maxn],ans=inf;
struct data
{
    long long val;
    long long id;
    data (long long val,long long id):val(val),id(id) {}
    data () {}
}x[maxn],y[maxn];
bool cmp(data x,data y)
{
    return x.val<y.val;
}
int main()
{
    scanf("%lld",&n);
    for (long long i=1;i<=n;i++)
    {
        scanf("%lld%lld",&xs,&ys);
        x[i]=data(xs+ys,i);y[i]=data(xs-ys,i);
    }
    sort(x+1,x+n+1,cmp);sort(y+1,y+n+1,cmp);
    for (long long i=1;i<=n;i++) idx[x[i].id]=i,idy[y[i].id]=i;
    for (long long i=1;i<=n;i++) sumx[i]=sumx[i-1]+x[i].val,sumy[i]=sumy[i-1]+y[i].val;
    for (long long i=1;i<=n;i++)
    {
        long long k1=idx[i],k2=idy[i];
        ans=min(ans,sumx[n]-2*sumx[k1]+2*k1*x[k1].val-n*x[k1].val + sumy[n]-2*sumy[k2]+2*k2*y[k2].val-n*y[k2].val);
    }
    printf("%lld\n",ans/2);
    return 0;
}
时间: 2024-10-15 02:45:25

BZOJ 3170 松鼠聚会的相关文章

【BZOJ】【3170】【TJOI2103】松鼠聚会

切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现dist(i,j)是 i 和 j 的切比雪夫距离,那么同样的,我们可以将它们转成曼哈顿来做.(x[i]=x+y; y[i]=x-y;) 然后就是求n个点到某一个点的曼哈顿距离和的最小值了. 由于是曼哈顿距离,所以x和y是无关的,我们可以分开计算! 对x排序,我们可以发现,所有点到x[1]的距离就是$\

BZOJ 3170: [Tjoi 2013]松鼠聚会( sort )

题目的距离为max(|x1-x2|, |y1-y2|) (切比雪夫距离). 切比雪夫距离(x, y)->曼哈顿距离((x+y)/2, (x-y)/2) (曼哈顿(x, y)->切比雪夫(x+y, x-y)). 转成Manhattan distance后排序前缀和维护即可. -------------------------------------------------------------------------- #include<cstdio> #include<cs

bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)

题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^

3170: [Tjoi 2013]松鼠聚会

3170: [Tjoi 2013]松鼠聚会 Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. Sample Input 6 -4 -1

bzoj3170【TJOI2013】松鼠聚会

3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 965  Solved: 475 [Submit][Status][Discuss] Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=

【bzoj3170】[Tjoi2013]松鼠聚会

3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1670  Solved: 885[Submit][Status][Discuss] Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10

BZOJ 1037 生日聚会Party(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1037 题意:给定n个0m个1.有多少种排列方式使得任意一段中01的个数差小于等于K? 思路:f[i][j][k][t]表示i个0.j个1.0比1最多多k个.1比0最多多t的方案数. int n,m,K,f[N][N][21][21]; void up(int &x,int y) { x+=y; if(x>=mod) x-=mod; } int main() { RD(n,m,K);

【BZOJ3170】[Tjoi 2013]松鼠聚会 旋转坐标系

[BZOJ3170][Tjoi 2013]松鼠聚会 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. Input 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 Output 表示为了聚会走的路程和最小为多少. Sample Input 6 -4 -1 -1 -2 2

BZOJ 3170 [Tjoi 2013]松鼠聚会

题目描述 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短距离. 输入 第一行给出数字N,表示有多少只小松鼠.0<=N<=10^5下面N行,每行给出x,y表示其家的坐标.-10^9<=x,y<=10^9 输出 表示为了聚会走的路程和最小为多少. 样例输入 6 -4 -1 -1 -2 2 -4 0 2 0 3 5 -2 样例输出 20 解题思路 新学了一个姿