题意:
思路
采用data[maxn],next[maxn]和list[maxn],ans[maxn]来记录链表
其他的都挺简单的,就是翻转的规律难找:
ans[i]=list[i/k*k+k-1-i%k];
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100010;
int main(){
int n,k,p,sum=0;
int data[maxn],next[maxn],list[maxn],ans[maxn];
cin >> p >> n >> k;
for(int i=0;i<n;i++){
int s,d,e;
scanf("%d%d%d",&s,&d,&e);
data[s]=d;
next[s]=e;
}
for(;p!=-1;p=next[p]){
list[sum++]=p;
}
for(int i=0;i<sum;i++) ans[i]=list[i];
for(int i=0;i<sum-sum%k;i++){
ans[i]=list[i/k*k+k-1-i%k];
}
for(int i=0;i<sum-1;i++){
printf("%05d %d %05d\n",ans[i],data[ans[i]],ans[i+1]);
}
printf("%05d %d -1",ans[sum-1],data[ans[sum-1]]);
return 0;
}