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
接着,每次输入插入坐标
这时候特判一波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;
}

浙公网安备 33010602011771号