AtCoder Beginner Contest 178(E,F)

发布时间 2023-07-08 14:29:41作者: righting

AtCoder Beginner Contest 178(E,F)

E(计算几何)

给出\(n\)个点坐标,我们需要知道两个不同的点之间的曼哈顿的最大的那一个,求\(max(abs(x_i-x_j)+abs(y_i-y_j))\)

题意很好懂,就是如果按照最简单的想法,可以一个一个找,我们枚举不同的组合,但是这样显然是不太可能的,这样会超时

然后我们可以把这个转换成另外一种形式

\[max((x_i+y_i)-(x_j+y_j),(x_i-y_i)+(x_j-y_j)) \]

不同距离之间的转换

所以每一个坐标,我们只需要记录\(x+y\)\(x-y\)的情况

然后求取差值的最大值

具体看代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-10
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=1e6+10;
const int mod=1e9+7;
int tt;
int n,d1[maxn],d2[maxn];
void solve()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    int x,y;
    cin>>x>>y;
    d1[i]=x-y;
    d2[i]=x+y;
  }
  sort(d1+1,d1+1+n);
  sort(d2+1,d2+1+n);
  int ans=max(d1[n]-d1[1],d2[n]-d2[1]);
  cout<<ans<<"\n";
  return ;
}
signed main ()
{
  //ios;
 // cin>>t;
  tt=1;
  //cin>>tt;
  while (tt--)
  {
    solve();
  }
  system ("pause");
  return 0;
}

F(思维)

F

这个题目的大意是给出两个数组,我们可以把第二个数组改变成任意顺序,问最后可以把后面的数组变成每一个位置和前一个数组的该位置的数字不一样(简而言之,就是两个数组在同一位置有着不同的数字)

题目还告诉了我们这两个数组最初的状态都是从小到大的,那么\(A\)数组一定是从大到小的,然后我们可以考虑让\(B\)数组从大到小,这样,最差的情况,出现同一位置出现了一样的数字,这个数字也只能有一位\(val\)(这样就好办了),后面我们可以考虑那些出现不同数字的位置然后也不等于这个\(val\),我们可以把在那个相同位置的\(val\)换到这个位置来,只要我们可以解决这些\(val\)在同一位置的情况,即成功

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-10
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=1e6+10;
const int mod=1e9+7;
int tt;
int n,a[maxn],b[maxn];
int same[maxn],swp[maxn];
bool cmp(int x,int y)
{
  return x>y;
}
void solve()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
  }
  for(int i=1;i<=n;i++)
  {
    cin>>b[i];
  }
  sort(b+1,b+1+n,cmp);
  int cnt=0;
  int val=0;
  int cnt2=0;
  for(int i=1;i<=n;i++)
  {
    if(a[i]==b[i])
    {
      same[++cnt]=i;
      val=a[i];
    }
  }
  for(int i=1;i<=n;i++)
  {
    if(cnt2>=cnt)break;
    if(a[i]!=b[i])
    {
      if(a[i]!=val&&b[i]!=val)
      {
        swp[++cnt2]=i;
      }
    }
  }
  if(cnt2<cnt)
  {
    cout<<"No"<<"\n";
    return ;
  }
  cout<<"Yes\n";
  for(int i=1;i<=cnt;i++)
  {
    swap(b[same[i]],b[swp[i]]);
  }
  for(int i=1;i<=n;i++)
  {
    cout<<b[i]<<" ";
  }
  cout<<"\n";
  return ;
}
signed main ()
{
  //ios;
 // cin>>t;
  tt=1;
  //cin>>tt;
  while (tt--)
  {
    solve();
  }
  system ("pause");
  return 0;
}