# [Luogu P2900][USACO08MAR]土地征用Land Acquisition

[Luogu P2900][USACO08MAR]土地征用Land Acquisition

## 题目描述

Farmer John is considering buying more land for the farm and has his eye on N (1 <= N <= 50,000) additional rectangular plots, each with integer dimensions (1 <= width_i <= 1,000,000; 1 <= length_i <= 1,000,000).

If FJ wants to buy a single piece of land, the cost is \$1/square unit, but savings are available for large purchases. He can buy any number of plots of land for a price in dollars that is the width of the widest plot times the length of the longest plot. Of course, land plots cannot be rotated, i.e., if Farmer John buys a 3×5 plot and a 5×3 plot in a group, he will pay 5×5=25.

FJ wants to grow his farm as much as possible and desires all the plots of land. Being both clever and frugal, it dawns on him that he can purchase the land in successive groups, cleverly minimizing the total cost by grouping various plots that have advantageous width or length values.

Given the number of plots for sale and the dimensions of each, determine the minimum amount for which Farmer John can purchase all

## 输入输出格式

### 输入格式

* Line 1: A single integer: N

* Lines 2..N+1: Line i+1 describes plot i with two space-separated integers: width_i and length_i

### 输出格式

* Line 1: The minimum amount necessary to buy all the plots.

## 输入输出样例

### 输入样例#1

``````4
100 1
15 15
20 5
1 100
``````

### 输出样例#1

``````500
``````

## 说明

There are four plots for sale with dimensions as shown.

The first group contains a 100×1 plot and costs 100. The next group contains a 1×100 plot and costs 100. The last group contains both the 20×5 plot and the 15×15 plot and costs 300. The total cost is 500, which is minimal.

## 代码

``````#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

struct __{
int x, y;
}_;
int n, maxy, q, head, tail;
long long f, x, y;

bool cmp(const __ &A, const __ &B){return A.x==B.x ? A.y>B.y : A.x>B.x;}

int main(){
memset(f, 0x3f3f3f3f, sizeof(f));
f=0;
scanf("%d", &n);
for(int i=1; i<=n; i++)	scanf("%d%d", &_[i].x, &_[i].y);
sort(_+1, _+n+1, cmp);
for(int i=1; i<=n; i++)
if(maxy<_[i].y)	x[++x]=_[i].x, y[++y]=_[i].y, maxy=_[i].y;
q=0;
for(int i=1; i<=x; i++){