ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

区块反转(模拟、链表)

2022-08-26 12:32:49  阅读:148  来源: 互联网

标签:cnt int 反转 d% 链表 add nex 区块


题意

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有