区块反转(模拟、链表)
作者:互联网
题意
题目链接:https://www.acwing.com/problem/content/description/4280/
数据范围
\(1 \leq K, N \leq 10^5\)
思路
这道题难度不大,但是我们需要思考如果写得更加简短。
这里给出yxc的实现方式。以地址为索引,使用两个数组存储节点的数值以及下一个节点的地址。
用一个数组按照链表的顺序存储每个节点的地址,下面我们将这个数组称为“链表”。
将链表翻转。从后往前枚举所有区块,再将每一个区块翻转。
从前往后输出节点即可,节点的信息可以从存储信息的两个数组中查询。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1000010;
int n, m;
int w[N], ne[N];
int q[N];
int main()
{
int h;
scanf("%d%d%d", &h, &n, &m);
for(int i = 0; i < n; i ++) {
int add, val, nex;
scanf("%d%d%d", &add, &val, &nex);
w[add] = val, ne[add] = nex;
}
int cnt = 0;
for(int i = h; ~i; i = ne[i]) {
q[cnt] = i;
cnt ++;
}
reverse(q, q + cnt);
for(int r = cnt - 1; r >= 0; r --) {
int l = max(0, r - m + 1);
reverse(q + l, q + r + 1);
r = l;
}
for(int i = 0; i < cnt; i ++) {
int add = q[i], nex = q[i + 1];
printf("%05d %d ", add, w[add]);
if(i == cnt - 1) puts("-1");
else printf("%05d\n", nex);
}
return 0;
}
标签:cnt,int,反转,d%,链表,add,nex,区块 来源: https://www.cnblogs.com/miraclepbc/p/16627183.html