CF1027D. Come a Little Closer (multiset使用)

D. Come a Little Closer

codeforces原题链接:https://codeforces.com/contest/2114/problem/D

Output

For each test case, output a single integer — the minimum cost to destroy all n
monsters.

Example

Input

7
3
1 1
1 2
2 1
5
1 1
2 6
6 4
3 3
8 2
4
1 1
1 1000000000
1000000000 1
1000000000 1000000000
1
1 1
5
1 2
4 2
4 3
3 1
3 2
3
1 1
2 5
2 2
4
4 3
3 1
4 4
1 2

Output

3
32
1000000000000000000
1
6
4
8

思路:

这道题使用multiset来解决似乎非常合适😋,首先先用vector分别存储每个怪物x和y的坐标
接着,每次输入插入坐标
这时候特判一波n=1的情况,如果为1直接输出答案
接下来遍历每个怪物作为被移动的那个的情况
特判类似样例1的情况
如果区域面积s小于了n说明说这时候是塞不下所有的怪兽的,考虑将x方向扩大一个间隔或者y方向扩大一个间隔的情况,然后更新ans
其余情况就是直接更新ans

题解

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;
int t;
int n;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>t;
    while(t--)
    {
        cin>>n;
        vector<ll> vx(n),vy(n);
        multiset<ll>mx,my;
        for(int i=0;i<n;i++)
        {
            cin>>vx[i]>>vy[i];
            mx.insert(vx[i]);
            my.insert(vy[i]);
        }
        if(n==1)
        {
            cout<<1<<endl;
            continue;
        }
        ll ans = LLONG_MAX;
        for(int i=0;i<n;i++)
        {
            mx.erase(mx.find(vx[i]));
            my.erase(my.find(vy[i]));

            ll rx = *mx.rbegin();
            ll lx = *mx.begin();
            ll ry = *my.rbegin();
            ll ly = *my.begin();
            ll s = (rx-lx+1)*(ry-ly+1);
            
            if(s==n-1)
            {
                ll s1 = (rx-lx+2)*(ry-ly+1);
                ll s2 = (rx-lx+1)*(ry-ly+2);
                ans = min(ans,min(s1,s2));
            }
            else ans = min(ans,s);
            mx.insert(vx[i]);
            my.insert(vy[i]);
        }
        cout<<ans<<endl;

        

    }

    return 0;
}


posted @ 2025-05-27 23:22  屈臣  阅读(62)  评论(0)    收藏  举报