题目传送门

sol:第一次看题还真信了是用线段树来做,但是没什么想法,看了题解发现是我不会的Treap,然后花了几天时间学习了一下并补掉题目

  • 无旋Treap

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MAXN = 2e5 + ;
    struct Treap {
    int ls, rs;
    int rand, size;
    LL sum, val, lazy;
    } node[MAXN];
    int root, tot;
    int add_node(int v) {
    int i = ++tot;
    node[i].ls = node[i].rs = ;
    node[i].rand = rand();
    node[i].sum = node[i].val = v;
    node[i].lazy = ;
    node[i].size = ;
    return i;
    }
    void push_down(int rt) {
    int ls = node[rt].ls;
    int rs = node[rt].rs;
    if (ls != ) {
    node[ls].lazy += node[rt].lazy;
    node[ls].val += node[rt].lazy;
    node[ls].sum += node[ls].size * node[rt].lazy;
    }
    if (rs != ) {
    node[rs].lazy += node[rt].lazy;
    node[rs].val += node[rt].lazy;
    node[rs].sum += node[rs].size * node[rt].lazy;
    }
    node[rt].lazy = ;
    }
    void push_up(int rt) {
    int ls = node[rt].ls;
    int rs = node[rt].rs;
    node[rt].size = node[ls].size + node[rs].size + ;
    node[rt].sum = node[ls].sum + node[rs].sum + node[rt].val;
    }
    void split(int rt, int& a, int& b, int s) {
    if (rt == ) {
    a = b = ;
    return;
    }
    push_down(rt);
    int size = node[node[rt].ls].size;
    if (size < s) {
    a = rt;
    split(node[rt].rs, node[a].rs, b, s - size - );
    } else {
    b = rt;
    split(node[rt].ls, a, node[b].ls, s);
    }
    push_up(rt);
    }
    void merge(int& rt, int a, int b) {
    if (a == || b == ) {
    rt = a + b;
    return;
    }
    push_down(a);
    push_down(b);
    if (node[a].rand < node[b].rand) {
    rt = a;
    merge(node[rt].rs, node[a].rs, b);
    } else {
    rt = b;
    merge(node[rt].ls, a, node[b].ls);
    }
    push_up(rt);
    }
    void insert(int p, int v) {
    int x = , y = ;
    split(root, x, y, p - );
    merge(root, x, add_node(v));
    merge(root, root, y);
    }
    void add(int l, int r, int v) {
    int x = , y = , z = ;
    split(root, root, z, r);
    split(root, x, y, l - );
    node[y].lazy += v;
    node[y].val += v;
    node[y].sum += node[y].size * v;
    merge(root, x, y);
    merge(root, root, z);
    }
    LL query(int l, int r) {
    int x = , y = , z = ;
    split(root, root, z, r);
    split(root, x, y, l - );
    LL sum = node[y].sum;
    merge(root, x, y);
    merge(root, root, z);
    return sum;
    }
    int main() {
    int n, q;
    scanf("%d", &n);
    for (int i = ; i <= n; i++) {
    int v; scanf("%d", &v);
    merge(root, root, add_node(v));
    }
    scanf("%d", &q);
    for (int i = ; i <= q; i++) {
    int opt; scanf("%d", &opt);
    if (opt == ) {
    int pos; scanf("%d", &pos);
    insert(pos, );
    } else if (opt == ) {
    int l, r, v;
    scanf("%d%d%d", &l, &r, &v);
    add(l, r, v);
    } else {
    int l, r;
    scanf("%d%d", &l, &r);
    printf("%lld\n", query(l, r));
    }
    }
    return ;
    }

    在前置知识都掌握的情况下Treap还是挺好懂的,而且之前感觉lazy标记挺乱的,看了这题之后感觉理清了

牛客-Forsaken的数列(Treap)的更多相关文章

  1. 牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)

    https://ac.nowcoder.com/acm/contest/907/C 链接:https://ac.nowcoder.com/acm/contest/907/C来源:牛客网 题目描述 Ra ...

  2. C数列下标 牛客OI赛制测试赛2

    链接:https://www.nowcoder.com/acm/contest/185/C来源:牛客网 给出一个数列 A,求出一个数列B. 其中Bi   表示 数列A中 Ai 右边第一个比 Ai 大的 ...

  3. 牛客小白月赛18 Forsaken给学生分组

    牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 ​ Forsaken有 ...

  4. 牛客小白月赛18 Forsaken喜欢数论

    牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 ​ Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...

  5. 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解

    题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...

  6. 斐波那契数列 牛客网 剑指Offer

    斐波那契数列 牛客网 剑指Offer 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 class Solution: ...

  7. 最大连续数列和 牛客网 程序员面试金典 C++ Python

    最大连续数列和 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有正有负的整数数组,请找出总和最大的连续数列. 给定一个int数组A和数组大小n,请返回最大的连续数列的和.保证n的大小 ...

  8. 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)

    题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...

  9. 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契

    牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...

随机推荐

  1. It can be a face application using SeetaFace and Qt.

    之前编译了一下SeetaFace的库,用于人脸检测.特征点定位和人脸识别的功能,然后昨天就用Qt写了一个软件用于实现. 工程的文件还是比较简单的,一个界面类和一个SeetaFace的线程类而已.这里主 ...

  2. python一个正则表达式的不解

    htmlSource="data-lazy=\"http://gtms01.alicdn.com/tps/i1/T1faOCFQXXXXc2jIrl-.png\"&quo ...

  3. LeetCode 543. Diameter of Binary Tree 二叉树的直径 (C++/Java)

    题目: Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of ...

  4. 吴裕雄--天生自然 PHP开发学习:数组排序

    <?php $cars=array("Volvo","BMW","Toyota"); sort($cars); print_r($ca ...

  5. PCB布局注意事项

    PCB布局注意事项   1.实现统一功能电路模块中的元件应采用就近集中原则,同时数字电路和模拟电路分开; 2.定位孔.标准孔等非安装孔周围1.27mm 内不得贴装元.器件,螺钉等安装孔周围3.5mm( ...

  6. 复杂分布式架构下的计算治理之路:计算中间件 Linkis

    前言 在当前的复杂分布式架构环境下,服务治理已经大行其道.但目光往下一层,从上层 APP.Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的 ...

  7. UML-如何画通信图?

    1.链 2.消息 3.自身传递消息 4.消息顺序编号 5.有条件消息 6.互斥的有条件消息 7.循环或迭代 8.调用静态方法 9.多态 10.同步和异步调用

  8. Disruptor的简单介绍与应用

    前言 最近工作比较忙,在工作项目中,看了很多人都自己实现了一套数据任务处理机制,个人感觉有点乱,且也方便他人的后续维护,所以想到了一种数据处理模式,即生产者.缓冲队列.消费者的模式来统一大家的实现逻辑 ...

  9. windows通过Winscp传输文件给Vbox虚拟机

    1.VirtualBox->设置->网络->高级->端口转发->Rule 1 TCP 127.0.0.1 22 10.0.2.15(在CentOS中通过ip addr命令 ...

  10. 题解【语文1(chin1)- 理理思维】

    link 喵~珂朵莉树AC 珂朵莉树?见此处~ 这数据结构太暴力了,所以不讲了 Code: #include<iostream> #include<cstdio> #inclu ...