数列所有公式大全_splay树

数列所有公式大全_splay树请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线 _ 表示实际输入文件中的空格)输入格式第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。第 2 行包含 N 个数字,描述初始时的数列。以下 M 行,每行一条命令,格式参见问题描述中的表格。输出格式对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。数据范围与约定你可以认为在任何时刻,数列中至少有 1 个数。输入

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线 _ 表示实际输入文件中的空格)

在这里插入图片描述

输入格式
第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。

第 2 行包含 N 个数字,描述初始时的数列。

以下 M 行,每行一条命令,格式参见问题描述中的表格。

输出格式
对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。

数据范围与约定
你可以认为在任何时刻,数列中至少有 1 个数。

输入数据一定是正确的,即指定位置的数在数列中一定存在。

50% 的数据中,任何时刻数列中最多含有 30000 个数;100% 的数据中,任何时刻数列中最多含有 500000 个数。

100% 的数据中,任何时刻数列中任何一个数字均在 [−1000,1000] 内。

100% 的数据中,M≤20000,插入的数字总数不超过 4000000 个,输入文件大小不超过 20 MBytes。

输入样例:
9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM
输出样例:
-1
10
1
10


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 3000010, INF = 1e9;
int nodes[N], tt;
struct Node{ 
   
    int s[2], v, p;
    int same, rev;
    int siz, ms, ls, rs, sum;
    void init(int _p, int _v)
    { 
   
        v = _v, p = _p; s[0] = s[1] = 0;
        same = rev = 0;
        siz = 1; sum = ms = v; ls = rs = max(v, 0);
    }
}t[N];
int root, idx;
int w[N];
void pushup(int u)
{ 
   
    auto &fa = t[u], &l = t[t[u].s[0]], &r = t[t[u].s[1]];
    fa.siz = l.siz + r.siz + 1;
    fa.ms = max(max(l.ms, r.ms), l.rs + r.ls + fa.v);
    fa.ls = max(l.ls, l.sum + r.ls + fa.v);
    fa.rs = max(r.rs, r.sum + l.rs + fa.v);
    fa.sum = l.sum + r.sum + fa.v;
}
void pushdown(int x)
{ 
   
    auto &u = t[x], &l = t[t[x].s[0]], &r = t[t[x].s[1]];
    if(u.same)
    { 
   
        u.same = u.rev = 0;
        if(u.s[0]) l.same = 1, l.v = u.v, l.sum = l.siz * l.v;
        if(u.s[1]) r.same = 1, r.v = u.v, r.sum = r.siz * r.v;
        if(u.v > 0)
        { 
   
            if(u.s[0]) l.ls = l.rs = l.ms = l.sum;
            if(u.s[1]) r.ls = r.rs = r.ms = r.sum;
        }
        else 
        { 
   
            if(u.s[0]) l.ls = l.rs = 0, l.ms = l.v;
            if(u.s[1]) r.ls = r.rs = 0, r.ms = r.v;
        }
    }
    else if(u.rev)
    { 
   
        u.rev = 0; l.rev ^= 1, r.rev ^= 1;
        swap(l.s[0], l.s[1]); swap(l.ls, l.rs);
        swap(r.s[0], r.s[1]); swap(r.ls, r.rs);
    }
}
void rotate(int x)
{ 
   
    int y = t[x].p, z = t[y].p;
    int k = t[y].s[1] == x;
    t[z].s[t[z].s[1] == y] = x; t[x].p = z;
    t[y].s[k] = t[x].s[k ^ 1], t[t[x].s[k ^ 1]].p = y;
    t[x].s[k ^ 1] = y; t[y].p = x;
    pushup(y); pushup(x);
}
void splay(int x, int p)
{ 
   
    while(t[x].p != p)
    { 
   
        int y = t[x].p, z = t[y].p;
        if(z != p)
            if(t[y].s[1] == x ^ t[z].s[1] == y) rotate(x);
            else rotate(y);
        rotate(x);
    }
    if(!p) root = x;
}
int build(int l, int r,int p)
{ 
   
    int mid = l + r >> 1;
    int u = nodes[tt --];
    t[u].init(p, w[mid]);
    if(mid > l) t[u].s[0] = build(l, mid - 1, u); 
    if(mid < r) t[u].s[1] = build(mid + 1, r, u);
    pushup(u);
    return u;
}
int get_k(int siz)
{ 
   
    int u = root;
    while(u)
    { 
   
        pushdown(u);
        if(t[t[u].s[0]].siz >= siz) u = t[u].s[0];
        else if(t[t[u].s[0]].siz + 1 == siz) return u;
        else siz -= t[t[u].s[0]].siz + 1, u = t[u].s[1];
    }
    return -1;
}
void dfs(int u)
{ 
   
    if(t[u].s[0]) dfs(t[u].s[0]);
    if(t[u].s[1]) dfs(t[u].s[1]);
    nodes[++ tt] = u;
}
int main()
{ 
   
    for(int i = 1; i < N; ++ i) nodes[++ tt] = i;
    int n, m; scanf("%d%d", &n, &m);

    w[0] = -INF, w[n + 1] = -INF;
    t[0].ms = -INF;
    for(int i = 1; i <= n; ++ i) scanf("%d", &w[i]);
    root = build(0, n + 1, 0);
    char op[10];
    while(m --)
    { 
   
        scanf("%s", op);
        if(!strcmp(op, "INSERT"))
        { 
   
            int pos, len;
            scanf("%d%d", &pos, &len);
            for(int i = 0; i < len; ++ i) scanf("%d", &w[i]);
            int l = pos + 1, r = pos + 2;
            l = get_k(l); r = get_k(r);
            splay(l, 0); splay(r, l);
            t[r].s[0] = build(0, len - 1, r);
            pushup(r); pushup(l);
        }
        else if(!strcmp(op, "DELETE"))
        { 
   
            int pos, len;scanf("%d%d", &pos, &len);
            int l = get_k(pos), r = get_k(pos + len + 1);
            splay(l, 0); splay(r, l);
            dfs(t[r].s[0]);
            t[r].s[0] = 0;
            pushup(r); pushup(l);
            
        }
        else if(!strcmp(op, "MAKE-SAME"))
        { 
   
            int pos, len, c; scanf("%d%d%d", &pos, &len, &c);
            int l =get_k(pos), r = get_k(pos + len + 1);
            splay(l, 0); splay(r, l);
            auto &ch = t[t[r].s[0]];
            ch.same = 1; ch.v = c; ch.sum = c * ch.siz;
            if(c > 0) ch.ms = ch.ls = ch.rs = ch.sum;
            else ch.ms = ch.v, ch.ls = ch.rs = 0;
            pushup(r); pushup(l);
        }
        else if(!strcmp(op, "REVERSE"))
        { 
   
            int pos, len; scanf("%d%d", &pos, &len);
            int l =get_k(pos), r = get_k(pos + len + 1);
            splay(l, 0); splay(r, l);
            auto &ch = t[t[r].s[0]];
            ch.rev ^= 1;
            swap(ch.s[0], ch.s[1]);
            swap(ch.ls, ch.rs);
            pushup(r); pushup(l);
        }
        else if(!strcmp(op, "GET-SUM"))
        { 
   
            int pos, len; scanf("%d%d", &pos, &len);
            int l =get_k(pos), r = get_k(pos + len + 1);
            splay(l, 0); splay(r, l);
            printf("%d\n", t[t[r].s[0]].sum);
        }
        else printf("%d\n", t[root].ms);
        
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169090.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月10日 下午9:46
下一篇 2022年8月10日 下午9:46


相关推荐

  • 完整教程:在 Claude Code 中设置 MCP 服务器(技术总结)

    完整教程:在 Claude Code 中设置 MCP 服务器(技术总结)

    2026年3月16日
    2
  • vc++连接sql数据库_vscode怎么连接数据库

    vc++连接sql数据库_vscode怎么连接数据库vc连接mysql数据库的方法:首先打开VC6;然后在中间列表框中添加本地安装MySQL的include目录路径;接着选中“Libraryfiles”并添加MySQL的Lib目录路径;最后进行编程测试即可。一、MySQL的安装Mysql的安装去官网下载就可以。。。最新的是5.7版本。。二、VC6.0的设置(1)打开VC6.中选0工具栏Tools菜单下的Options选项,在Directorie…

    2022年8月12日
    8
  • Android常用加密方式

    Android常用加密方式加密解密简介加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。加密技术包括两个元素:算法和密钥。算法是将普通的信息或者可以理解的信息与一串数字(密钥)结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解密的一种算法。在安全保密中,可通过适当的钥加密技术和管理机制来保证网络的信息通信安全。加迷解密分类分为不可逆和…

    2022年5月17日
    41
  • windows使用claude code最全教程

    windows使用claude code最全教程

    2026年3月16日
    1
  • 二阶线性微分方程解的结构(齐次与非齐次)+ 常数变易法 | 高阶微分方程(二)

    二阶线性微分方程解的结构(齐次与非齐次)+ 常数变易法 | 高阶微分方程(二)一 线性微分方程的解的结构 1 1 二阶齐次线性方程 y P x y Q x y 0 1 y P x y Q x y 0 tag 1 y P x y Q x y 0 1 定理 1 如果函数 y1 x y 1 x y1 x 与 y2 x y 2 x y2 x 是方程 1 的两个解 那么 y C1y1 x C2y2 x 2 y C 1y 1 x C 2y 2 x tag 2 y C1 y1 x C2 y2 x 2 也是方程 1 的解 其中 C1 C2C 1 C 2C

    2025年6月22日
    4
  • pycharm安装教程,超详细

    pycharm安装教程,超详细在安装 pycharm 之前 确保你的电脑配置好了 python 没有下载安装的可以去看我的文章 gt gt gt python 安装详细教程 pycharmwindo 版本下载地址 https www jetbrains com pycharm download section windows 下载社区版本 日常学习使用够用了 专业版是收费的哦 功能更强大 下载完后打开安装程序 点击 next 选择一个路径然后 next 把这些选项都勾选上 点击 Install 安装完后点击 Finish

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号