zoukankan      html  css  js  c++  java
  • HDU 4699 Editor (2013多校10,1004题)

    Editor

    Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 118    Accepted Submission(s): 38


    Problem Description
     
    Sample Input
    8 I 2 I -1 I 1 Q 3 L D R Q 2
     
    Sample Output
    2 3
    Hint
    The following diagram shows the status of sequence after each instruction:
     
    Source
     
    Recommend
    zhuyuanchen520
     

    这题只要用双向链表模拟一下。

    查询最大前缀和,相当于维护一个单调队列。

      1 /* ***********************************************
      2 Author        :kuangbin
      3 Created Time  :2013/8/22 13:38:35
      4 File Name     :F:2013ACM练习2013多校101004.cpp
      5 ************************************************ */
      6 
      7 #include <stdio.h>
      8 #include <string.h>
      9 #include <iostream>
     10 #include <algorithm>
     11 #include <vector>
     12 #include <queue>
     13 #include <set>
     14 #include <map>
     15 #include <string>
     16 #include <math.h>
     17 #include <stdlib.h>
     18 #include <time.h>
     19 using namespace std;
     20 const int MAXN = 1000010;
     21 
     22 int a[MAXN];
     23 int next[MAXN],pre[MAXN],tot;
     24 int NewNode()
     25 {
     26     next[tot] = -1;
     27     pre[tot] = -1;
     28     tot++;
     29     return tot-1;
     30 }
     31 int root;
     32 int sum[MAXN];
     33 vector<int>vec;
     34 int now;
     35 int n;
     36 void init()
     37 {
     38     tot = 0;
     39     root = NewNode();
     40     vec.clear();
     41     n = now = 0;
     42 }
     43 
     44 void I(int x)
     45 {
     46     n++;
     47     int t = NewNode();
     48     a[t] = x;
     49     pre[t] = now;
     50     next[t] = next[now];
     51     if(next[now] != -1)pre[next[now]] = t;
     52     next[now] = t;
     53     now = t;
     54     if(n == 1)
     55     {
     56         sum[n] = x;
     57         vec.push_back(n);
     58     }
     59     else
     60     {
     61         sum[n] = sum[n-1] + x;
     62         int sz = vec.size();
     63         if(sum[n] > sum[vec[sz-1]])
     64             vec.push_back(n);
     65     }
     66 }
     67 void D()
     68 {
     69     if(n == 0)return;
     70     int sz = vec.size();
     71     if(vec[sz-1] == n)
     72         vec.pop_back();
     73     n--;
     74     int t = pre[now];
     75     next[t] = next[now];
     76     if(next[now] != -1)pre[next[now]] = t;
     77     now = t;
     78 }
     79 void L()
     80 {
     81     if(n == 0)return;
     82     int sz = vec.size();
     83     if(vec[sz-1] == n)
     84         vec.pop_back();
     85     now = pre[now];
     86     n--;
     87 }
     88 void R()
     89 {
     90     if(next[now] == -1)return;
     91     n++;
     92     now = next[now];
     93     if(n == 1)
     94     {
     95         sum[n] = a[now];
     96         vec.push_back(n);
     97     }
     98     else
     99     {
    100         int sz = vec.size();
    101         sum[n] = sum[n-1] + a[now];
    102         if(sum[n] > sum[vec[sz-1]])
    103             vec.push_back(n);
    104     }
    105 }
    106 
    107 
    108 int Q(int k)
    109 {
    110     int sz = vec.size();
    111     if(vec[sz-1] <= k)
    112         return sum[vec[sz-1]];
    113     int t = upper_bound(vec.begin(),vec.end(),k) - vec.begin();
    114     return sum[vec[t-1]];
    115 }
    116 
    117 
    118 int main()
    119 {
    120     //freopen("in.txt","r",stdin);
    121     //freopen("out.txt","w",stdout);
    122     int M;
    123     int x;
    124     char op[10];
    125     while(scanf("%d",&M) == 1)
    126     {
    127         init();
    128         while(M--)
    129         {
    130             scanf("%s",&op);
    131             if(op[0] == 'I')
    132             {
    133                 scanf("%d",&x);
    134                 I(x);
    135             }
    136             else if(op[0] == 'D')
    137                 D();
    138             else if(op[0] == 'L')
    139                 L();
    140             else if(op[0] == 'R')
    141                 R();
    142             else
    143             {
    144                 scanf("%d",&x);
    145                 printf("%d
    ",Q(x));
    146             }
    147         }
    148     }
    149     return 0;
    150 }
  • 相关阅读:
    使用jedis连接redis
    布隆过滤器redis缓存
    SQL与NOSQL
    Charles 移动端抓包工具,使用方法以及注意事项
    安装npm包的时候报错rollbackFailedOptional: verb npm-session
    You may need an appropriate loader to handle this file type.
    数组去重
    判断两个数组是否相等(包括数组里边的键值对是否相等)
    数组里的字符串转为数字
    背景色铺满整个屏幕
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3275587.html
Copyright © 2011-2022 走看看