本题要过最后一个测试点代码要尽量不那么复杂。
第一遍做的时候定义了一个包含三个int的结构体,把地址,数字,下一个数字地址填进去。在遍历得到新顺序的时候用了循环嵌套,最后一个测试点直接运行超时。
第二遍的时候为了节省时间就只定义了一个包含两个int的结构,然后把地址当作下标,里面包含数字和下一个数字的地址。在排序的时候不需要循环,只需要根据下标就能找到下一个数。
排序就很简单用三个容器分别装进去,然后最后整成一个输出。(第一遍的没考虑某个容器为空的情况,分别把三个容器输出,最后发生段错误。整成一个就不会有这样的问题。)
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
struct node
{
int a;
int b;
};
int main(){
vector<node> fir,sec,thr,ans;
int add1,n,k,shou;
cin>>add1>>n>>k;
vector<node> chu(100000);
for (int i = 0; i < n; i++)
{
int qian,num,hou;
cin>>qian>>num>>hou;
chu[qian].a=num;
chu[qian].b=hou;
}
for (int i = add1; i>=0; i=chu[i].b)
{
node p;
if(chu[i].a<0){
p.a=i;
p.b=chu[i].a;
fir.push_back(p);
}
if(chu[i].a<=k&&chu[i].a>=0){
p.a=i;
p.b=chu[i].a;
sec.push_back(p);
}
if(chu[i].a>k){
p.a=i;
p.b=chu[i].a;
thr.push_back(p);
}
if(chu[i].b==-1) break;
}
int x=fir.size(),y=sec.size(),z=thr.size();
if(x!=0){for(int i=0;i<x;i++) ans.push_back(fir[i]);}
if(y!=0){for(int i=0;i<y;i++) ans.push_back(sec[i]);}
if(z!=0){for(int i=0;i<z;i++) ans.push_back(thr[i]);}
for (int i = 0; i < ans.size()-1; i++) printf("%05d %d %05d\n",ans[i].a,ans[i].b,ans[i+1].a);
printf("%05d %d -1\n",ans[ans.size()-1].a,ans[ans.size()-1].b);
}