E. Correct Placement(思维)
Posted zjj0624
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E. Correct Placement(思维)相关的知识,希望对你有一定的参考价值。
题意
给你n张纸片,每张纸片都有一个长和宽,对于每一张纸片i,我们都需要判断是否能找到另外一个纸片j,使纸片j可以放在纸片i上,切没有任何重合部分,如果存在就输出这个编号j,如果不存在就输出-1
思路
拿到这个题,我们很容易想到去排序一个长,或者宽,然后再从小到大遍历来判断是否可以找到编号j,但是因为可以改变长和宽的顺序,使这样排序以后找到的并不是完全正确的情况。
看了题解以后才发现,我们其实可以把长和宽存一个结构体里面,然后再交换长和宽再存进去一遍,这样排序以后就可以把所有的情况都考虑到。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 4e5+10;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
struct Node
{
int h,w,idx;
}a[N];
int ans[N];
bool cmp(Node x,Node y)
{
if(x.h==y.h) return x.w>y.w;
return x.h<y.h;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1 ; i<=n ; i++)
{
int hh,ww;
cin>>hh>>ww;
a[i].idx=i;
a[i+n].idx=i;
a[i].h=hh;
a[n+i].h=ww;
a[i].w=ww;
a[n+i].w=hh;
}
for(int i=1 ; i<=n ; i++) ans[i]=-1;
sort(a+1,a+1+2*n,cmp);
int minw=1e9;
int minw_idx=0;
// for(int i=1 ; i<=2*n ; i++) cout<<a[i].h<<" "<<a[i].w<<" "<<a[i].idx<<endl;
for(int i=1 ; i<=2*n ; i++)
{
if(a[i].w<minw)
{
minw=a[i].w;
minw_idx=a[i].idx;
}
else if(a[i].w>minw) if(ans[a[i].idx]==-1) ans[a[i].idx]=minw_idx;
//cout<<a[i].w<<" "<<minw<<endl;
}
for(int i=1 ; i<=n ; i++) cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}
总结
没有想到可以把长和宽存储一遍,然后交换顺序再存储一遍。
以上是关于E. Correct Placement(思维)的主要内容,如果未能解决你的问题,请参考以下文章
Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。(示例代