bzoj 1500 维修数列

本文介绍了一道涉及Splay树和FHQ Treap的数据结构题目,详细展示了这两种数据结构在解决特定类型问题时的实现过程。通过对边界条件的处理和维护函数的设计,该文对比了Splay树与FHQ Treap的特点,并通过具体代码示例说明了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



Description

Input

输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。
第2行包含N个数字,描述初始时的数列。
以下M行,每行一条命令,格式参见问题描述中的表格。
任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内。
插入的数字总数不超过4 000 000个,输入文件大小不超过20MBytes。

Output

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

Sample Input

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

Sample Output

-1
10
1
10
这题一看就是splay的水题,边界处理的要死了,第一遍用的splay,第二遍是fhqtreap实在是比splay好打,对于边界我是加了哨兵节点,不过在push_down和change的时候要判断一下,防止哨兵节点被修改,就因为这个被卡了好久,然后就没什么了,Maintain函数要写好一点。注意下细节就好了。

code:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAXN 500005
using namespace std;
int lst[MAXN],n,m;
  
  
int read(){
    int x=0,f=1;
    char ch=getchar();
    for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-f;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+(ch^48);
    return x*f;
}
  
struct node{
    int r,v,s,filp,lmaxn,rmaxn,maxn,sum;
    bool tag;
    node *ch[2];
  
    void Maintain();
  
    node(){
        r=0;v=0;s=0;
        filp=0;sum=0;tag=0;
        maxn=lmaxn=rmaxn=-inf;
        ch[0]=ch[1]=NULL;
    }
    void push_down();
  
    node(int x);
  
    void* operator new(size_t);
    void operator delete (void* p);
  
}*null=new node(),*C,*mempool,*root;
  
typedef pair<node*,node*>pa;
  
vector<node*>bin;
  
void change_tag(node *p,int val){
    if(p==null)return;
    p->rmaxn=p->lmaxn=p->maxn=max(val,val*p->s);
    p->sum=val*p->s;
    p->v=val;
    p->tag=1;
}
  
void change_filp(node *p){
    if(p==null)return;
    p->filp^=1;
    swap(p->lmaxn,p->rmaxn);
}
  
node :: node(int x){
    v=x;r=rand();s=1;
    filp=tag=0;
    lmaxn=rmaxn=maxn=sum=v;
    ch[0]=ch[1]=null;
}
  
void node ::  push_down(){
    if(this==null)return;
    if(filp){
        filp^=1;
        change_filp(ch[0]);
        change_filp(ch[1]);
        swap(ch[0],ch[1]);
    }
    if(tag){
        change_tag(ch[0],v);
        change_tag(ch[1],v);
        tag=0;
    }
}
  
void node :: Maintain(){
    if(this==null)return;
    push_down();
    s=ch[0]->s+ch[1]->s+1;
    sum=ch[0]->sum+ch[1]->sum+v;
    maxn = max(max(ch[0]->rmaxn,0)+v+max(ch[1]->lmaxn,0),max(ch[0]->maxn,ch[1]->maxn));
    lmaxn = max(ch[0]->lmaxn,ch[0]->sum+v+max(ch[1]->lmaxn,0));
    rmaxn = max(ch[1]->rmaxn,ch[1]->sum+v+max(ch[0]->rmaxn,0));
}
  
void* node :: operator new(size_t){
    node *p;
    if(!bin.empty()){
        p=bin.back();
        bin.pop_back();
    }
    else{
        if(C==mempool){
            C = new node[1<<15];
            mempool = C+(1<<15);
        }
        p = C ++;
    }
    return p;
}
  
void node :: operator delete(void *p){
    bin.push_back((node*)p);
}
  
pa spilt(node *o,int k){
    o->push_down();
    if(!k)return make_pair(null,o);
    if(o==null)return make_pair(null,null);
    if(k<=o->ch[0]->s){
        pa y = spilt(o->ch[0],k);
        o->ch[0]=y.second;
        o->Maintain();
        y.second=o;
        return y;
    }
    else{
        pa y = spilt(o->ch[1],k-o->ch[0]->s-1);
        o->ch[1]=y.first;
        o->Maintain();
        y.first=o;
        return y;
    }
}
  
node* merge(node *a,node *b){
    a->push_down();b->push_down();
    if(a==null)return b;
    if(b==null)return a;
    if(a->r>b->r){
        a->ch[1]=merge(a->ch[1],b);
        a->Maintain();
        return a;
    }
    else{
        b->ch[0]=merge(a,b->ch[0]);
        b->Maintain();
        return b;
    }
}
  
int Rank(int x){
    node *o=root;
    int ans = 0;
    while(o!=null){
        if(x<=o->v)o=o->ch[0];
        else ans+=o->ch[0]->s+1,o=o->ch[1];
    }
    return ans;
}
  
void make_same(int pos,int tot){
    int w = read();
    pa o = spilt(root,pos-1);
    pa x = spilt(o.second,tot);
    change_tag(x.first,w);
    root = merge(o.first,merge(x.first,x.second));
}
  
void make_filp(int pos,int tot){
    if(tot==0)return;
    pa o = spilt(root,pos-1);
    pa x = spilt(o.second,tot);
    change_filp(x.first);
    node *tmp=merge(x.first,x.second);
    root = merge(o.first,tmp);
}
  
node *build(int l,int r){
    if(l>r)return null;
    int m = l+r>>1;
    node *p=new node(lst[m]);
    p->ch[0]=build(l,m-1);
    p->ch[1]=build(m+1,r);
    p->Maintain();
    return p;
}
  
void insert(int pos,int tot){
    for(int i=1;i<=tot;i++)scanf("%d",&lst[i]);
    pa x = spilt(root,pos);
    root = merge(merge(x.first,build(1,tot)),x.second);
}
  
void dfs(node *p){
    if(p==null)return;
    dfs(p->ch[0]);
    dfs(p->ch[1]);
    delete p;
}
  
void erase(int pos,int tot){
    pa x = spilt(root,pos-1);
    pa y = spilt(x.second,tot);
    dfs(y.first);
    root = merge(x.first,y.second);
}
  
inline int max_sum(){
    if(root==null)return 0;
    return root->maxn;
}
  
inline void sum(int pos,int tot){
    if(tot==0){printf("0\n");return;}
    pa x = spilt(root,pos-1);
    pa y = spilt(x.second,tot);
    printf("%d\n",y.first->sum);
    node *tmp = merge(y.first,y.second);
    root = merge(x.first,tmp);
}
  
void dfs1(node *p){
    if(p==null)return;
    dfs1(p->ch[0]);
    printf("%d ",p->v);
    dfs1(p->ch[1]);
}
  
int main(){
    root = null;
    n=read(),m=read();
    insert(0,n);
    while(m--){
        char opt[10];
        scanf("%s",opt);
        if(opt[0]=='M'){
            if(opt[2]=='X')printf("%d\n",max_sum());
            else{ 
                int pos = read(),tot = read();
                make_same(pos,tot);
            }
            continue;
        }
        int pos = read(),tot=read();
        if(opt[0]=='I')insert(pos,tot);
        if(opt[0]=='G')sum(pos,tot);
        if(opt[0]=='D')erase(pos,tot);
        if(opt[0]=='R')make_filp(pos,tot);
    }
}




基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
标题基于SpringBoot的学生学习成果管理平台研究AI更换标题第1章引言介绍研究背景、目的、意义以及论文结构。1.1研究背景与目的阐述学生学习成果管理的重要性及SpringBoot技术的优势。1.2研究意义分析该平台对学生、教师及教育机构的意义。1.3论文方法与结构简要介绍论文的研究方法和整体结构。第2章相关理论与技术概述SpringBoot框架、学习成果管理理论及相关技术。2.1SpringBoot框架简介介绍SpringBoot的基本概念、特点及应用领域。2.2学习成果管理理论基础阐述学习成果管理的核心理论和发展趋势。2.3相关技术分析分析平台开发所涉及的关键技术,如数据库、前端技术等。第3章平台需求分析与设计详细分析平台需求,并设计整体架构及功能模块。3.1需求分析从学生、教师、管理员等角度对平台需求进行深入分析。3.2整体架构设计设计平台的整体架构,包括技术架构和逻辑架构。3.3功能模块设计具体设计平台的核心功能模块,如成果展示、数据分析等。第4章平台实现与测试阐述平台的实现过程,并进行功能测试与性能分析。4.1平台实现详细介绍平台的开发环境、关键代码实现及技术难点解决方案。4.2功能测试对平台各项功能进行全面测试,确保功能正确无误。4.3性能分析分析平台的性能指标,如响应时间、并发处理能力等。第5章平台应用与效果评估探讨平台在实际教学中的应用,并对其效果进行评估。5.1平台应用案例选取典型应用案例,展示平台在实际教学中的使用情况。5.2效果评估方法介绍平台效果评估的具体方法和指标。5.3评估结果分析根据评估数据,对平台的应用效果进行深入分析。第6章结论与展望总结论文的主要研究成果,并指出未来研究方向。6.1研究结论概括性地阐述论文的研究结论和主要贡献。6.2研究展望针对当前研究的不足之处,提出未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值