zoukankan      html  css  js  c++  java
  • 洛谷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代码
  • 相关阅读:
    [洛谷P1886]滑动窗口 (单调队列)(线段树)
    树状数组详细解析
    离散化
    kettle使用总结(一)
    springBoot开发的web项目打war包部署到已有的tomcat容器中
    集群时钟同步
    linux服务器安装nginx
    Tomcat学习之体系架构
    码云新建仓库上传项目
    linux系统安装mysql yum方式
  • 原文地址:https://www.cnblogs.com/huyufeifei/p/9354999.html
Copyright © 2011-2022 走看看