zoukankan      html  css  js  c++  java
  • BZOJ 3170 [Tjoi2013]松鼠聚会

    题解:切比雪夫距离转化为曼哈顿距离

    枚举源点,横纵坐标互不影响,分开考虑,前缀和优化

    横纵分开考虑是一种解题思路

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long Lint;
    const int maxn=100009;
    
    Lint ans=1000000000000000000LL;
    int n;
    int px[maxn],py[maxn];
    
    int a[maxn];
    Lint sa[maxn][2];
    
    int b[maxn];
    Lint sb[maxn][2];
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		int x,y;
    		scanf("%d%d",&x,&y);
    		px[i]=x+y;
    		py[i]=x-y;
    		a[i]=x+y;
    		b[i]=x-y;
    	}
    	sort(a+1,a+1+n);
    	sort(b+1,b+1+n);
    	
    	for(int i=1;i<=n;++i){
    		sa[i][0]=sa[i-1][0]+a[i]-a[1];
    		sb[i][0]=sb[i-1][0]+b[i]-b[1];
    	}
    	for(int i=n;i>=1;--i){
    		sa[i][1]=sa[i+1][1]+a[n]-a[i];
    		sb[i][1]=sb[i+1][1]+b[n]-b[i];
    	}
    	
    	for(int i=1;i<=n;++i){
    		int pa=lower_bound(a+1,a+1+n,px[i])-a;
    		int pb=lower_bound(b+1,b+1+n,py[i])-b;
    		Lint tm=0;
    		tm+=(sa[1][1]-sa[pa][1])-1LL*(a[n]-a[pa])*(pa-1);
    		tm+=(sa[n][0]-sa[pa][0])-1LL*(a[pa]-a[1])*(n-pa);
    		tm+=(sb[1][1]-sb[pb][1])-1LL*(b[n]-b[pb])*(pb-1);
    		tm+=(sb[n][0]-sb[pb][0])-1LL*(b[pb]-b[1])*(n-pb);
    		ans=min(ans,tm);
    	}
    	
    	printf("%lld
    ",ans/2);
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    docker学习
    获取程序所有加载的dll名称
    Microsoft.Exchange 发邮件
    EF实体对象解耦
    python并发与futures模块
    python协程
    python上下文管理器
    python迭代器与生成器
    python抽象基类
    python运算符重载
  • 原文地址:https://www.cnblogs.com/zzyer/p/8456347.html
Copyright © 2011-2022 走看看