首页 > 其他分享 >【学习笔记】函数复合:[PKUSC 2024] 排队

【学习笔记】函数复合:[PKUSC 2024] 排队

时间:2025-01-14 21:54:18浏览次数:1  
标签:ch return int void 笔记 son 2024 tag PKUSC

函数复合是这样的一类问题:

有一个函数序列 \(f_1, f_2, f_3, ..., f_n\)。离线询问,给定参数 \(x\), \(f_r(f_{r-1}(...f_l(x)))\) 的值。

有点抽象对吧。看道题就懂了。

[PKUSC 2024] 排队

QOJ 题目链接:#8672. 排队。(反正我在其他 OJ 上没找到)

前置知识:平衡树

题面上有简化题意,但我觉得看原题面更好理解。(懒得写题面了 qwq)

做法

我们考虑把询问离线下来扫描,然后维护一个多重集,集合里每个元素对一一个询问,表示扫到当前位置时这个询问的值是多少。

比如当前扫到 \(i\),那如果一个区间的 \(l=i\) 就往集合里加入一个“\(0\)”的值。然后把集合里位于 \([l_i,r_i]\) 内的值给 \(+1\)。最后,如果一个区间的 \(r=i\) 就记录答案。

这个东西可以平衡树维护,拿 fhq-treap 来说, 加入“\(0\)”是简单的。

然后将 \([l_i,r_i]\) 内的值给 \(+1\) 可以把那段的子集给 split 出来之后打个标记,再塞回去。

至于计算某个点 \(u\) 的答案,由于标记可能还没下传,所以要从 \(u\) 往上跳到根,统计 tag 的和。正好 fhq 有期望层数 \(\log\) 的性质,所以这个也是 \(\log\) 级别的。

设 \(n,m\) 同阶,那时间复杂度就是 \(\mathcal{O}(n\log n)\)。

代码

代码十分简单,如下:(这份开 C++17 还加快读快写才过的 qwq)

点击查看代码
// Author: Aquizahv
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
int n, m, l[N], r[N], ans[N];
vector<int> in[N], out[N];

struct treap
{
    int root, son[N][2], val[N], rank[N], tag[N], fa[N];
    void insert(int u)
    {
        rank[u] = rand();
        root = merge(u, root);
    }
    void add(int u, int x)
    {
        val[u] += x;
        tag[u] += x;
    }
    void pushdown(int u)
    {
        if (tag[u])
        {
            add(son[u][0], tag[u]);
            add(son[u][1], tag[u]);
            tag[u] = 0;
        }
    }
    void pushup(int u)
    {
        fa[son[u][0]] = fa[son[u][1]] = u;
    }
    void split(int u, int key, int &x, int &y)
    {
        if (!u)
        {
            x = y = 0;
            return;
        }
        pushdown(u);
        if (val[u] <= key)
        {
            x = u;
            split(son[u][1], key, son[u][1], y);
        }
        else
        {
            y = u;
            split(son[u][0], key, x, son[u][0]);
        }
        pushup(u);
    }
    int merge(int u, int v)
    {
        if (!u || !v)
            return u ^ v;
        pushdown(u), pushdown(v);
        if (rank[u] > rank[v])
        {
            son[u][1] = merge(son[u][1], v);
            pushup(u);
            return u;
        }
        else
        {
            son[v][0] = merge(u, son[v][0]);
            pushup(v);
            return v;
        }
    }
    int getsum(int u)
    {
        if (u == root)
            return tag[u];
        return tag[u] + getsum(fa[u]);
    }
} t;

inline int read()
{
    bool f = 1; int x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    { if (ch == '-') f = !f; ch = getchar(); }
    while (ch >= '0' && ch <= '9')
    { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
    return f ? x : -x;
}
inline void write(int x)
{
    if (x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x > 9)
        write(x / 10);
    putchar((x % 10) ^ 48);
}

int main()
{
#ifdef Aquizahv
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        l[i] = read(), r[i] = read();
    int L, R;
    for (int i = 1; i <= m; i++)
    {
        L = read(), R = read();
        in[L].push_back(i);
        out[R].push_back(i);
    }
    for (int i = 1; i <= n; i++)
    {
        for (auto j : in[i])
            t.insert(j);
        int x, y, z;
        t.split(t.root, r[i], x, z);
        t.split(x, l[i] - 1, x, y);
        t.add(y, 1);
        t.root = t.merge(t.merge(x, y), z);
        for (auto j : out[i])
            ans[j] = t.val[j] + (j != t.root ? t.getsum(t.fa[j]) : 0);
    }
    for (int i = 1; i <= m; i++)
        write(ans[i]), putchar('\n');
    return 0;
}

标签:ch,return,int,void,笔记,son,2024,tag,PKUSC
From: https://www.cnblogs.com/aquizahv/p/18671805

相关文章

  • WebScoket学习笔记
    WebScoket学习笔记1.消息推送常用方式介绍轮询浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。长轮询浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。SSEserver-sent-event:服务器发送事件SSE是在服务器和客户......
  • 【专题】2024年抖音电商年度高增长报告汇总PDF洞察(附原数据表)
    原文链接:https://tecdat.cn/?p=387972024年,服装内衣和美妆护肤品类在抖音电商平台上成为增长的强劲动力。相关统计显示,服装内衣品类的年增长率达到了29.59%。其中,少女文胸、唐装、民族服装和舞台服装的增长尤为显著,分别实现了59.17%和374.15%的增幅。消费者对内衣的舒适性和功能......
  • 关于CVE-2024-9047的分析
    1漏洞成因  本文的分析基于wp-file-upload.4.24.11。在wfu_file_downloader.php中存在可控变量$filepath,能够读取文件。漏洞代码如下所示:if($fd=wfu_fopen_for_downloader($filepath,"rb")){ $open_session=(($wfu_user_state_handler=="session"||$wfu_us......
  • 江科大STM32入门——读写备份寄存器(BKP)&实时时钟(RTC)笔记整理
    wx:嵌入式工程师成长日记https://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNhttps://mp.weixin.qq.com/s/hDk7QaXP8yfYIj1gUhtMrw?token=1051786482&lang=zh_CNRTC是一个独立的定时器,BKP并不能完全掉电不丢失,其可以完成一些主电源掉电时,保存少......
  • 【建议搜藏】最新版IDEA2024.3.1.1简介及使用
    IntelliJIDEA介绍IntelliJIDEA是一款用于Java语言开发的集成开发环境(IDE)。IntelliJIDEA被业界公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超棒的。IntelliJIDEA由JetBra......
  • EPLAN P8 学习笔记 配图 20250114
    组织结构、细节会生疏。Pageproperties-Fullpagename、Pagetype、PagedescriptionFullpagename-StructureidentifiersMainProjecttree-IdentifierStructurePageTypeNameDescriptionPagesObject元素structure结构identifier.excalidrawProjectData-S......
  • 2024秋季学期 理论力学期末复习笔记
    参考资料[1]秦敢,向守平.力学与理论力学(下册)[M].科学出版社,2017.8.[2]曹利明.理论力学课程讲义[Z].中国科学技术大学,2024.拉格朗日力学哈密顿力学刚体部分......
  • 《构建之法》阅读笔记二
    深入探索团队协作与软件项目管理再次研读《构建之法》,团队协作与软件项目管理的内容让我感触颇深。软件开发中,团队协作至关重要,直接影响项目成败。书中指出,团队成员间的沟通与协作是项目推进的关键。不同角色成员,如开发人员、测试人员、产品经理等,只有紧密配合,才能保证项目顺利......
  • 《构建之法》阅读笔记三
    思考软件工程的创新与发展第三次阅读《构建之法》,我对软件工程的创新与发展有了更深入的思考。在快速发展的今天,软件工程领域也在不断创新。书中提到,技术创新推动软件工程发展。新的编程语言、框架和工具不断涌现,为软件开发带来便利。云计算、大数据、人工智能等技术的兴起,改变......
  • 【Vim Masterclass 笔记12】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim
    文章目录Section7:TextObjectsandMacrosS07L28TextObjects1文本对象的含义2操作文本对象的基本语法3操作光标所在的整个单词4删除光标所在的整个句子5操作光标所在的整个段落6删除光标所在的中括号内的文本7删除光标所在的小括号内的文本8操作尖括号内的文......