bzoj1108[POI2007]天然气管道Gaz*
题意:
n个钻井,n个站,要求两两配对,但站必须在钻井的右下方。配一对的费用为两点的曼哈顿距离,求最小总费用。n≤50000。
题解:
发现满足条件站必须在钻井的右下方的所有配对方案的总费用是相同的,所以直接用站横坐标的和减钻井横坐标的和加上钻井纵坐标的和减站纵坐标的和即可。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 100010 7 #define ll long long 8 using namespace std; 9 10 inline int read(){ 11 char ch=getchar(); int f=1,x=0; 12 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 13 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 14 return f*x; 15 } 16 int n; ll ans; 17 int main(){ 18 n=read(); inc(i,1,n){int a=read(),b=read(); ans-=a; ans+=b;} 19 inc(i,1,n){int a=read(),b=read(); ans+=a; ans-=b;} printf("%lld",ans); return 0; 20 }
20160920