#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct Node
{
int address,data, next;
int order;
}node[maxn];
bool cmp(Node a, Node b)
{
return a.order < b.order;
}
int main()
{
for (int i = 0; i < maxn; i++)
{
node[i].order = maxn;
}
int begin, n, k;
int address;
scanf("%d%d%d", &begin, &n, &k);
for (int i = 0; i < n; i++)
{
scanf("%d", &address);
scanf("%d %d", &node[address].data, &node[address].next);
node[address].address = address;
}
int count = 0,p=begin;
while (p != -1)
{
node[p].order = count++;
p = node[p].next;
}
sort(node, node + maxn, cmp);
//因为最后一组不足则不反转,所以反转的组数为n/k,是定值
n = count;
for (int i = 0; i < n / k; i++)
{
for (int j = k - 1; j > 0; j--)
{
printf("%05d %d %05d\n", node[i*k + j].address, node[i*k + j].data,node[i*k+j-1].address);
}
printf("%05d %d ", node[i*k].address, node[i*k].data);//每组的最后一个要单独判断
if (i<n/k-1) printf("%05d\n",node[(i+2)*k-1].address);
else
{
if (n%k==0) printf("-1\n");//n可以被k整除
else
{
printf("%05d\n", node[(i + 1)*k].address);//不要漏掉之前的一组最后next的输出
int m;
for (m = (i + 1)*k; m < n-1; m++)
{
printf("%05d %d %05d\n", node[m].address, node[m].data, node[m + 1].address);
}
printf("%05d %d ", node[m].address, node[m].data);
printf("-1\n");
}
}
}
return 0;
}
以下mark一下大神解法
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int value[maxn], nt[maxn]; //存放值的数组 下一地址数组
int op[maxn]; //操作数组
int main(){
int head, n, k, address;
scanf("%d %d %d", &head , &n, &k);
for(int i = 0; i < n; ++i){
scanf("%d", &address);
scanf("%d %d", &value[address], &nt[address]);
}
int total = 0;
for(int i = head; i != -1; i = nt[i]){
op[total++] = i;
}
for(int i = 0; i + k <= total; i +=k){
for(int low = i, high = low + k - 1; low < high; ++low, --high){
swap(op[low], op[high]);
}
}
for(int i = 0; i < total; ++i){
if(i != total - 1){
printf("%05d %d %05d\n", op[i], value[op[i]], op[i + 1]);
}else{
printf("%05d %d -1\n", op[i], value[op[i]]);
}
}
return 0;
}