• CH128 Editor 题解报告


    题目传送门

    【题目大意】

    【思路分析】

    参考这道题“对顶堆”的做法,我们可以用一个类似的“对顶栈”做法。栈$a$记录从序列开头到光标位置的子序列,栈$b$记录从光标后到序列结尾的子序列,两个栈都以光标所在的一端为栈顶。因为第五种操作查询的位置$k$不超过光标位置,所以我们用一个数组$sum$记录栈$a$的前缀和,$f$记录前缀和最大,对于每种操作如下处理:

    1.“$I x$”操作:把$x$插入栈$a$,更新$sum$数组和$f$数组

    2.“$D$”操作:把$a$的栈顶弹出

    3.“$L$”操作:弹出$a$的栈顶,插入栈$b$

    4.“$R$”操作:弹出$b$的栈顶,插入栈$a$,更新$sum$数组和$f$数组

    5.“$Q k$”操作:直接返回$f[k]$

    弹出栈顶时要注意栈顶元素是否存在。

    【代码实现】

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define g() getchar()
     7 #define rg register
     8 #define go(i,a,b) for(rg int i=a;i<=b;i++)
     9 #define back(i,a,b) for(rg int i=a;i>=b;i--)
    10 #define db double
    11 #define ll long long
    12 #define il inline
    13 #define pf printf
    14 using namespace std;
    15 int fr(){
    16     int w=0,q=1;
    17     char ch=g();
    18     while(ch<'0'||ch>'9'){
    19         if(ch=='-') q=-1;
    20         ch=g();
    21     }
    22     while(ch>='0'&&ch<='9') w=(w<<1)+(w<<3)+ch-'0',ch=g();
    23     return w*q;
    24 }
    25 const int N=1e6+2;
    26 int a[N],b[N],sum[N],f[N],q,ha,hb;
    27 int main(){
    28     q=fr();
    29     go(i,0,q) f[i]=-N;
    30     go(i,1,q){
    31         char type;int x;
    32         cin>>type;
    33         if(type=='I'){
    34             x=fr();a[++ha]=x;
    35             sum[ha]=sum[ha-1]+x;
    36             f[ha]=max(f[ha-1],sum[ha]);
    37         }
    38         if(type=='D'&&ha>0) ha--;
    39         if(type=='L'&&ha>0){
    40             b[++hb]=a[ha];
    41             ha--;
    42         }
    43         if(type=='R'&&hb>0){
    44             a[++ha]=b[hb];
    45             hb--;
    46             sum[ha]=sum[ha-1]+a[ha];
    47             f[ha]=max(f[ha-1],sum[ha]);
    48         }
    49         if(type=='Q'){
    50             x=fr();
    51             pf("%d
    ",f[x]);
    52         }
    53     }
    54     return 0;
    55 }
    代码戳这里
  • 相关阅读:
    TCP/IP协议栈与数据包封装+TCP与UDP区别
    MySQL数据库优化总结
    MySQL存储引擎,锁,优化简述
    java实现常见查找算法
    Java的几种常见排序算法
    UML类图学习
    高性能的RTC服务器OpenFire
    常用的设计模式
    Swing JInternalFrame的使用
    Qt 模态与非模态
  • 原文地址:https://www.cnblogs.com/THWZF/p/11347287.html
Copyright © 2020-2023  润新知