数据结构_主席树_HDU 5919 Sequence II

2023-11-01

HDU 5919 Sequence II

CCPC长春赛区现场赛的题,可惜自己太菜,当时不会做,听了老哥的教训后,决定好好学习主席树。


思路:考虑每个点带来的影响。

显然,若从前向后考虑,对于第i个数,对结果的影响仅为
1. 若该数字未出现过,添加一个新位置i
2. 若出现过,无操作。
但是“这种影响是不全面的”,因为它无法表现从i起始时的结果。

如果从后向前考虑,每个点对结果的影响为
1. 更新某个数字出现的位置。
2.1 若该数字未出现过,则添加新的位置
2.2 若出现过,则消去前面曾经出现的位置,并添加新的位置
我们可以表现从任意起始时的结果。

#include <iostream>
#include <cstdio>
#include<cstring>
#include <algorithm>
using namespace std;
#define lson tn[x].ls
#define rson tn[x].rs

const int maxn = 200000;

struct TreeNode {
    int ls, rs; //左右子节点
    int value;    //值
};

TreeNode tn[maxn * 50];
int POS, VALUE;
int cnt;
int N, M;
int a[maxn + 10], mp[maxn + 10];
int tr[maxn + 10]; //tr[i] 树根i的节点编号

int node(int v, int ls, int rs) {
    tn[cnt].value = v;
    tn[cnt].ls = ls;
    tn[cnt].rs = rs;
    return cnt ++;
}

void Maintain(int x) {
    tn[x].value = tn[lson].value + tn[rson].value;
}

/*
 * 建空树
 */
void Build(int &x, int l = 1, int r = N) {
    x = node(0, -1, -1);
    if(l == r) {
        return;
    }

    int mid = (l + r) >> 1;
    Build(lson, l, mid);
    Build(rson, mid + 1, r);
}

/*
 * 插入新节点
 */
void Insert(int pre, int &x, int l = 1, int r = N) {
    x = node(tn[pre].value, tn[pre].ls, tn[pre].rs);
    if(l == r) {
        tn[x].value = VALUE;
        return;
    }

    int m = (l + r) >> 1;
    if(POS <= m) {
        Insert(lson, lson, l, m);
    } else {
        Insert(rson, rson, m + 1, r);
    }
    Maintain(x);
}

/*
 * 查找根为x时的,前k个数的和
 */
int Query(int x, int ll, int rr, int l = 1, int r = N) {
    if(ll <= l && r <= rr) {
        return tn[x].value;
    }
    int m = (l + r) >> 1;
    int ans = 0;
    if(ll <= m)
        ans += Query(lson, ll, rr, l, m);
    if(rr > m) {
        ans += Query(rson, ll, rr, m + 1, r);
    }
    return ans;
}

/*
 * 查找根为x时的,第k个数
 */
int Find(int x, int k, int l = 1, int r = N) {
    if(l == r) {
        return l;
    }
    int tmp = tn[lson].value;
    int m = (l + r) >> 1;
    if(k <= tmp)return Find(lson, k, l, m);
    else return Find(rson, k - tmp, m + 1, r);
}

int main() {
    int T, k;
    scanf("%d", &T);
    for(int CASE = 1; CASE <= T; CASE++) {
        memset(mp, -1, sizeof(mp));
        scanf("%d%d", &N, &M);
        for(int i = 1; i <= N; i ++) {
            scanf("%d", &a[i]);
        }
        cnt = 1;
        Build(tr[N + 1]);

        for(int i = N; i > 0; i --) {
            if(mp[a[i]] == -1) {
                POS = i;
                VALUE = 1;
                Insert(tr[i + 1], tr[i]);
            } else {
                POS = i;
                VALUE = 1;
                Insert(tr[i + 1], tr[i]);
                POS = mp[a[i]];
                VALUE = 0;
                Insert(tr[i], tr[i]);
            }
            mp[a[i]] = i;
        }

        int ans = 0;
        printf("Case #%d:", CASE);
        while(M --) {
            int l, r;
            scanf("%d%d", &l, &r);

            l = (l + ans) % N + 1;
            r = (r + ans) % N + 1;
            if(r < l) swap(l, r);
            int all = Query(tr[l], l, r);
            printf(" %d", ans = Find(tr[l], (all + 1) >> 1));
        }
        puts("");
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构_主席树_HDU 5919 Sequence II 的相关文章

  • 【LeetCode 每日一题】53. 最大子数组和

    01 题目描述 给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 02 示例 示例1 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连

随机推荐

  • 服务器安装/卸载MySQL5.7

    服务器安装 卸载MySQL5 7 本文章使用的是CentOS7 6 一 安装 1 下载MySQL 下载软件 wget i c http dev mysql com get mysql57 community release el7 10 n
  • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10582

    Exception in thread main java lang ArrayIndexOutOfBoundsException 10582 at com thoughtworks paranamer BytecodeReadingPar
  • 【开发工具】PyChram的下载和安装(windows系统)

    PyChram的下载和安装目录 一 PyChram的下载 二 PyChram的安装 三 PyChram的使用 一 PyChram的下载 PyCharm是 种Python IDE 集成开发环境 分为专业版 professional 和社区版
  • Python 计算机视觉(二) —— OpenCV 基础

    目录 1 安装配置 2 OpenCV 基础语法 1 读取图像并显示 2 调整显示窗口大小 3 调整图像尺寸大小 4 图像灰度处理 3 几何图形绘制 1 绘制线段 2 绘制矩形 3 绘制圆形 4 绘制椭圆 5 添加文本 总结 1 安装配置 打
  • odoo14 只编辑状态可见或只读状态可见

    odoo源码定义了两个类 oe read only oe edit only oe read only 只在只读状态下内容可见 编辑状态不可见 oe edit only 只在编辑状态下内容可见 只读状态不可见 使用环境 1 可以定义按钮只在
  • 小伙伴们要的安装指南——打开aiXcoder的正确方式

    作为国内用户最多的代码自动生成与补全产品 aiXcoder背后由当前SOTA的代码大模型为小伙伴们提供服务 包括智能代码生成 代码补全 代码搜索等功能 帮助小伙伴们自动完成 系列开发工作 提升开发效率和代码质量 以下是在IntelliJ I
  • C++复习笔记--虚析构和纯虚析构的使用

    目录 1 前言 2 虚析构和纯虚析构 3 代码实例 3 1 父类对象无法调用子类析构函数 3 2 虚析构实现 3 3 纯虚析构实现 1 前言 在使用多态时 如果子类的属性开辟到堆区 那么父类指针在释放时将无法调用子类的析构代码 此时需要将父
  • MYSQL脱敏

    文章目录 MYSQL脱敏 权限限制 单库级别 单表级别 单列级别 MYSQL脱敏 脱敏 脱离敏感信息 有时候开发需要权限查找一些数据 那么mysql数据库存放着很多重要数据信息 肯定不能随便让别人看到 这时候需要进行脱敏操作 这是为了权限最
  • 【Linux常用服务器配置——Samba服务】

    目录 1 简介 2 Samba的服务组成 3 安装samba服务 4 查看安装状况 5 设置开机自启动 6 启动服务 7 查看samba服务进程 8 防火墙设置 9 修改主配置文件 10 建立共享目录 11 重启smb服务 12 测试smb
  • cuda和cudnn下载安装

    Visual Studio cuda和cudnn下载安装 严格按照以下顺序执行 否则可能会报错 一 Visual Studio2019下载安装 网址 https visualstudio microsoft com zh hans vs 无
  • 使用 marked + highlight + tocify.tsx 完成 Markdown(码克党)笔记的渲染

    前几天看技术胖的视频 做了一个笔记的渲染功能 记录一下做法 以后忘记了可以查看 可能不是很理解 先记录 一般 我们的文章页面 或是 后台的管理 页面 平常可能要 渲染文章 和 编写文章时的浏览 我们可以使用 以下几个插件来完成这个任务 ma
  • 数据库知识点汇总(一)

    一 基本概念 数据 描述事物的符号记录称为数据 描述事物的符号可以是数字 也可以是文字 图形 图像 音频 视频等 数据有多种表现形式 它们都可以经过数字化后存入计算机 数据库 数据库是长期储存在计算机内 有组织的 可共享的大量数据的集合 数
  • 6168 Problem A Speech Patterns (25)

    问题 A Speech Patterns 25 时间限制 1 Sec 内存限制 32 MB 题目描述 People often have a preference among synonyms of the same word For ex
  • int main ( int argc, char** argv )的说明

    argc是命令行总的参数个数 argv 是argc个参数 其中第0个参数是程序的全名 以后的参数命令行后面跟的用户输入argc是命令行总的参数个数 比如 int main int argc char argv int i for i 0 i
  • ORACLE存储过程入门

    一 定义 存储过程 Stored Procedure 是在大型数据库系统中 一组为了完成特定功能的SQL 语句集 存储在数据库中 经过第一次编译后再次调用不需要再次编译 用户通过指定存储过程的名字并给出参数 如果该存储过程带有参数 来调用存
  • 渗透靶机测试之DC:1

    一 查看靶机要求 需要通过这个靶机来获得五个标志 在root的主目标中查找和读取 那就是直接拿到这个靶机的权限就行了 二 进行主机发现 三 对主机进行详细扫描及浏览主页 在网上查找Drupal 发现这个cms存在漏洞 打开msf进行漏洞查找
  • 算法笔记4.7--求第K大的数

    给定一个长度为n 1 n 1 000 000 的无序正整数序列 以及另一个数k 1 k 1 000 000 关于第k大的数 例如序列 1 2 3 4 5 6 中第3大的数是4 输入 第一行两个正整数m n 第二行为n个正整数 输出 第k大的
  • 为什么使用了索引,查询还是慢?

    经常有朋友问到 我的一个SQL语句使用了索引 为什么还是会进入到慢查询之中呢 今天我们就从这个问题开始来聊一聊索引和慢查询 1 案例分析 言归正传 为了实验 我创建了如下表 CREATE TABLE T id int 11 NOT NULL
  • 【Unity3D】血条(Health Bar)

    作业要求 血条 Health Bar 的预制设计 具体要求如下 分别使用 IMGUI 和 UGUI 实现 使用 UGUI 血条是游戏对象的一个子元素 任何时候需要面对主摄像机 分析两种实现的优缺点 给出预制的使用方法 实验内容 IMGUI制
  • 数据结构_主席树_HDU 5919 Sequence II

    HDU 5919 Sequence II CCPC长春赛区现场赛的题 可惜自己太菜 当时不会做 听了老哥的教训后 决定好好学习主席树 思路 考虑每个点带来的影响 显然 若从前向后考虑 对于第i个数 对结果的影响仅为 1 若该数字未出现过 添