• AOJ DSL_2_D Range Update Query (RUQ)


    Range Update Query

    数列 A = {a0,a1 ,...,an−1} に対し、次の2つの操作を行うプログラムを作成せよ。

    • update(s,t,x): as,as+1,...,at をxに変更する。
    • find(i): ai の値を出力する。

    ただし、ai (i=0,1,...,n−1)は、231-1で初期化されているものとする。

    入力

    n q
    query1
    query2
    :
    queryq
    

    1行目にAの要素数n, クエリの数qが与えられる。続くq行にi 番目のクエリ queryi が与えられる。queryi は以下のいずれかの形式で与えられる。

    0 s t x

    または

    1 i

    各クエリの最初の数字は、クエリの種類を示し、'0'がupdate(s,t,x)、'1'がfind(i) を表す。

    出力

    findクエリについて、値を1行に出力せよ。

    制約

    • 1≤n≤100000
    • 1≤q≤100000
    • 0≤st<n
    • 0≤i<n
    • 0≤x<231−1

    入力例 1

    3 5
    0 0 1 1
    0 1 2 3
    0 2 2 2
    1 0
    1 1
    

    出力例 1

    1
    3
    

    入力例 2

    1 3
    1 0
    0 0 0 5
    1 0
    

    出力例 2

    2147483647
    5
    

     
     

    区间修改,单点查询,线段树+tag标记。压了压常数,继续打榜。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 
     5 #define siz 10000000
     6 
     7 char buf[siz], *bit = buf;
     8 
     9 inline int nextInt(void) {
    10     register int ret = 0;
    11     register int neg = false;
    12 
    13     for (; *bit < '0'; ++bit)
    14         if (*bit == '-')neg ^= true;
    15 
    16     for (; *bit >= '0'; ++bit)
    17         ret = ret * 10 + *bit - '0';
    18 
    19     return neg ? -ret : ret;
    20 }
    21 
    22 #define inf 2147483647
    23 
    24 int n, m;
    25 
    26 int tag[400005];
    27 
    28 int find(int t, int l, int r, int p) {
    29     if (~tag[t])
    30         return tag[t];
    31     int mid = (l + r) >> 1;
    32     if (p <= mid)
    33         return find(t << 1, l, mid, p);
    34     else
    35         return find(t << 1 | 1, mid + 1, r, p);
    36 }
    37 
    38 void update(int t, int l, int r, int x, int y, int k) {
    39     if (l == x && r == y)
    40         tag[t] = k;
    41     else {
    42         int mid = (l + r) >> 1;
    43         if (~tag[t])
    44             tag[t << 1] = tag[t << 1 | 1] = tag[t], tag[t] = -1;
    45         if (y <= mid)
    46             update(t << 1, l, mid, x, y, k);
    47         else if (x > mid)
    48             update(t << 1 | 1, mid + 1, r, x, y, k);
    49         else {
    50             update(t << 1, l, mid, x, mid, k);
    51             update(t << 1 | 1, mid + 1, r, mid + 1, y, k);
    52         }
    53     }
    54 }
    55 
    56 signed main(void) {
    57     fread(buf, 1, siz, stdin);
    58 
    59     n = nextInt();
    60     m = nextInt();
    61 
    62     for (int i = 0; i < (n << 2); ++i)
    63         tag[i] = inf;
    64 
    65     for (int i = 1; i <= m; ++i) {
    66         int c = nextInt();
    67         if (c)    // find(x)
    68             printf("%d
    ", find(1, 1, n, nextInt() + 1));
    69         else {
    70             int x = nextInt();
    71             int y = nextInt();
    72             int k = nextInt();
    73             update(1, 1, n, x + 1, y + 1, k);
    74         }
    75     }
    76 
    77     //system("pause");
    78 }

    @Author: YouSiki

  • 相关阅读:
    ubuntu虚拟机下提示Network service discovery disabled
    jq简单实现选项卡--tab
    sublime text 出现错误error trying to parse file:Unexpected trailing characters in PackagesUserDefault(Windows).sublime-keymap:1:54
    sublime text 3设置快捷键让html文件在浏览器打开
    自动刷新浏览器
    项目---开饭了
    关于面试
    软件测试学习-关于三次握手与四次挥手的理解
    软件测试学习-笔记
    软件测试学习-数据库基础
  • 原文地址:https://www.cnblogs.com/yousiki/p/6189405.html
Copyright © 2020-2023  润新知