P5086 的题解

(一)

将输入的四个数差分得到三个值,这三个值相同的两个坐标符合条件。

用 map 存储记录这三个值的结构体,然后用 vector 存储下标。

(二)

AC 代码。

#include<bits/stdc++.h>
#define db double
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f; 
}
struct node{
	int x,y,z;
	bool operator<(const node &p)const{
		return x<p.x||x==p.x&&y<p.y||x==p.x&&y==p.y&&z<p.z;
	}
};
map<node,vector<int> >mp;
int n,ans1=INT_MAX,ans2;
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    n=read();
    for(int i=1;i<=n;i++){
    	int a=read(),b=read(),c=read(),d=read();
    	mp[(node){b-a,c-b,d-c}].pb(i);
    }
    for(auto t:mp){
    	vector<int>v=t.se;
    	if(v.size()<2)continue;
    	for(int i=0;i<v.size()-1;i++)
    		ans1=min(ans1,v[i+1]-v[i]);
    	ans2=max(ans2,v[v.size()-1]+v[v.size()-2]);
    }
    printf("%d %d\n",ans1,ans2);
    return 0;
}
posted @ 2024-08-05 14:26  Jerry_heng  阅读(6)  评论(0编辑  收藏  举报