• [JSOI2008]最大数maxnumber


    嘟嘟嘟

    就是线段树板子题,还是单点修改区间查询。

    用一个指针cnt记录当前序列里有几个数,然后操作1就是把++cnt的位置的数改为(n + t) % d;操作2就是查询cnt - L + 1到cnt的区间最大值。

    我用的是先把线段树的节点开好的方法,所以这题按区间长度等于m开就行。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<cctype>
     8 #include<vector>
     9 #include<stack>
    10 #include<queue>
    11 using namespace std;
    12 #define enter printf("
    ")
    13 #define space printf(" ")
    14 #define Mem(a) memset(a, 0, sizeof(a))
    15 typedef long long ll;
    16 typedef double db;
    17 const int INF = 0x3f3f3f3f;
    18 const int eps = 1e-8;
    19 const int maxn = 2e5 + 5;
    20 inline ll read()
    21 {
    22     ll ans = 0;
    23     char ch = getchar(), last = ' ';
    24     while(!isdigit(ch)) {last = ch; ch = getchar();}
    25     while(isdigit(ch))
    26     {
    27         ans = ans * 10 + ch - '0'; ch = getchar();
    28     }
    29     if(last == '-') ans = -ans;
    30     return ans;
    31 }
    32 inline void write(ll x)
    33 {
    34     if(x < 0) x = -x, putchar('-');
    35     if(x >= 10) write(x / 10);
    36     putchar(x % 10 + '0');
    37 }
    38 
    39 int m, cnt = 0;
    40 ll mod;
    41 ll t = 0;
    42 
    43 int l[maxn << 2], r[maxn << 2];
    44 ll Max[maxn << 2];
    45 void build(int L, int R, int now)
    46 {
    47     l[now] = L; r[now] = R;
    48     if(L == R) return;
    49     int mid = (L + R) >> 1;
    50     build(L, mid, now << 1);
    51     build(mid + 1, R, now << 1 | 1);
    52 }
    53 void update(int id, ll d, int now)
    54 {
    55     if(l[now] == r[now]) {Max[now] = d; return;}
    56     int mid = (l[now] + r[now]) >> 1;
    57     if(id <= mid) update(id, d, now << 1);
    58     else update(id, d, now << 1 | 1);
    59     Max[now] = max(Max[now << 1], Max[now << 1 | 1]);
    60 }
    61 ll query(int L, int R, int now)
    62 {
    63     if(l[now] == L && r[now] == R) return Max[now];
    64     int mid = (l[now] + r[now]) >> 1;
    65     if(R <= mid) return query(L, R, now << 1);
    66     else if(L > mid) return query(L, R, now << 1 | 1);
    67     else return max(query(L, mid, now << 1), query(mid + 1, R, now << 1 | 1));
    68 }
    69 
    70 int main()
    71 {
    72     m = read(); mod = read();
    73     build(1, m, 1);
    74     for(int i = 1; i <= m; ++i)
    75     {
    76         char c; cin >> c;
    77         if(c == 'A')
    78         {
    79             ll n = read(); 
    80             update(++cnt, (n + t) % mod, 1);
    81         }
    82         else
    83         {
    84             int L = read();
    85             t = query(cnt - L + 1, cnt, 1);
    86             write(t); enter;
    87         }
    88     }
    89     return 0;
    90 }
    View Code
  • 相关阅读:
    SQL的join使用图解
    归并排序的JAVA实现
    java 快速排序 时间复杂度 空间复杂度 稳定性
    哈希表(HashMap)分析及实现(JAVA)
    外部排序
    海量数据面试题整理
    《CSS3秘籍》第6、7章
    《CSS3秘籍》第3-5章
    《CSS3秘籍》第1、2章
    《HTML5与CSS3基础教程》第11、14-16、18章
  • 原文地址:https://www.cnblogs.com/mrclr/p/9482021.html
Copyright © 2020-2023  润新知