• 洛谷P4145 上帝造题的⑦minutes ②


    又是线段树。

    区间开平方求和,套路题。

    如果开到了1就不用再开下去了,否则直接到底。

    记得 l > r 时交换 l r

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <algorithm>
     4 typedef long long LL;
     5 const int N = 100010;
     6 struct SegmentTree {
     7     LL sum[N << 2];
     8     bool vis[N << 2];
     9 
    10     inline void pushup(int l, int r, int o) {
    11         if(l == r) {
    12             if(sum[o] == 1) {
    13                 vis[o] = 1;
    14             }
    15             return;
    16         }
    17         sum[o] = sum[o << 1] + sum[o << 1 | 1];
    18         vis[o] = (sum[o] == (r - l + 1));
    19         return;
    20     }
    21     void change(int L, int R, int l ,int r, int o) {
    22         if(vis[o]) {
    23             return;
    24         }
    25         int mid = (l + r) >> 1;
    26         if(l == r) {
    27             sum[o] = (LL)(sqrt((long double)(sum[o])));
    28             pushup(l, r, o);
    29             return;
    30         }
    31         if(L <= mid) {
    32             change(L, R, l, mid, o << 1);
    33         }
    34         if(mid < R) {
    35             change(L, R, mid + 1, r, o << 1 | 1);
    36         }
    37         pushup(l, r, o);
    38         return;
    39     }
    40     LL ask(int L, int R, int l, int r, int o) {
    41         if(L <= l && r <= R) {
    42             return sum[o];
    43         }
    44         if(r < L || R < l) {
    45             return 0;
    46         }
    47         int mid = (l + r) >> 1;
    48         return ask(L, R, l, mid, o << 1) + ask(L, R, mid + 1, r, o << 1 | 1);
    49     }
    50     void build(int l, int r, int o) {
    51         if(l == r) {
    52             scanf("%lld", &sum[o]);
    53             pushup(l, r, o);
    54             return;
    55         }
    56         int mid = (l + r) >> 1;
    57         build(l, mid, o << 1);
    58         build(mid + 1, r, o << 1 | 1);
    59         pushup(l, r, o);
    60         return;
    61     }
    62 }SgT;
    63 
    64 int main() {
    65     int n;
    66     scanf("%d", &n);
    67     SgT.build(1, n, 1);
    68     int m;
    69     scanf("%d", &m);
    70     int f, x, y;
    71     while(m--) {
    72         scanf("%d%d%d", &f, &x, &y);
    73         if(x > y) {
    74             std::swap(x, y);
    75         }
    76         if(f) {
    77             printf("%lld
    ",SgT.ask(x, y, 1, n, 1));
    78         }
    79         else {
    80             SgT.change(x, y, 1, n, 1);
    81         }
    82     }
    83     return 0;
    84 }
    AC代码
  • 相关阅读:
    merge sorted array
    Remove Duplicates from Sorted List
    climbing stairs(爬楼梯)(动态规划)
    点击事件加不上,换个位置调用
    The file couldn’t be opened because you don’t have permission to view it
    网络——性能调优
    SDWebImage缓存图片的机制(转)
    本地推送 简单代码演示
    UILable点击事件
    点击背景键盘退下
  • 原文地址:https://www.cnblogs.com/huyufeifei/p/9354999.html
Copyright © 2020-2023  润新知