其他分享
首页 > 其他分享> > 区块反转(模拟、链表)

区块反转(模拟、链表)

作者:互联网

题意

题目链接: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