萌新求助
查看原帖
萌新求助
174897
zjrdmd楼主2021/1/21 20:54

我觉得我写的没啥问题啊/kk,写了个SPJ已经测了10000组+了也没看出来哪错了/kk

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int

inline int read() {
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

const int N=2e5+5;
struct node{
	int a,b,num;
}ifm[N];
int ans[N],p[N],m[N],n;

bool cmp(node x,node y){
    if(x.a==y.a)return x.b<y.b;
    return x.a<y.a;
}

void work(){
	for(ri i=1;i<=n;i++)m[i]=1e9+7;
	int last=1,i;
	p[1]=ifm[1].num,m[1]=ifm[1].b,ans[ifm[1].num]=-1;
	for(i=2;ifm[i].a==ifm[i-1].a;i++){
		ans[ifm[i].num]=-1;
		if(m[last]<ifm[i].b)p[i]=p[i-1],m[i]=m[i-1];
		else m[i]=ifm[i].b,p[i]=ifm[i].num;
	}
	for(;i<=n;i++){
		if(ifm[i].a>ifm[i-1].a)last=i-1;
//		printf("%d %d %d\n",last,p[last],m[last]);
		if(m[last]<ifm[i].b)ans[ifm[i].num]=p[last],p[i]=p[i-1],m[i]=m[i-1];
		else ans[ifm[i].num]=-1,m[i]=ifm[i].b,p[i]=ifm[i].num;
	}
	for(ri i=1;i<=n;i++)printf("%d ",ans[i]);
	printf("\n");
}

int main(){
	int T=read();
	while(T--){
		n=read();
		for(ri i=1;i<=n;i++){
			ifm[i].a=read(),ifm[i].b=read(),ifm[i].num=i;
			if(ifm[i].a>ifm[i].b)std::swap(ifm[i].a,ifm[i].b);
		}
		std::sort(ifm+1,ifm+n+1,cmp);
//		printf("\n");
//		for(ri i=1;i<=n;i++)printf("%d %d\n",ifm[i].a,ifm[i].b);
//		printf("\n");
		work();
	}
	return 0;
}

2021/1/21 20:54
加载中...