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(思维)的主要内容,如果未能解决你的问题,请参考以下文章

E. Magic Stones CF 思维题

E. Sonya and Ice Cream(开拓思维)

Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。(示例代

E. Common Number (思维 + 规律)

E. DeadLee 思维 贪心 cf官方答案代码详解

E. Optimal Polygon Perimeter (思维)