• P4145 上帝造题的七分钟 2 / 花神游历各国


    //#include <bits/stdc++.h>
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <vector>
    #include <map>
    #include <queue>
    #include <algorithm>
    #include <math.h>
    #include <cstdio>
    using namespace std;
    typedef long long LL;
    const int N = 1e6 + 5;
    LL a[N];
    
    struct Node {
        int l, r;
        LL sum; //区间和
    } tr[N << 2];
    
    void pushup(int u) {
        tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
    }
    
    void build(int u, int l, int r) {
        tr[u] = {l, r};
        if (l == r) {
            tr[u].sum = a[l]; //构建线段树,叶子节点给定初始值
            return;
        }
        int mid = (l + r) >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        //更新父节点信息
        pushup(u);
    }
    
    void modify(int u, int l, int r) {
        //减枝 如果区间和等于区间长度,说明每个节点值都是1,此时再开方没有意义
        if (tr[u].sum == (tr[u].r - tr[u].l + 1)) return;
        //如果在区间内
        if (tr[u].l == tr[u].r) {
            tr[u].sum = (LL)sqrt(tr[u].sum); //暴力开方
            return;
        }
        //中点
        int mid = (tr[u].l + tr[u].r) >> 1;
        //与左儿子有交集,递归修改左儿子
        if (l <= mid) modify(u << 1, l, r);
        //与右儿子有交集,递归修改右儿子
        if (r > mid) modify(u << 1 | 1, l, r);
        //向父节点传递统计信息
        pushup(u);
    }
    
    //非常标准的查询
    LL query(int u, int l, int r) {
        if (r < tr[u].l || l > tr[u].r) return 0;
        if (l <= tr[u].l && tr[u].r <= r) return tr[u].sum;
        return query(u << 1, l, r) + query(u << 1 | 1, l, r);
    }
    
    int main() {
        int n, q, cas = 1;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
        build(1, 1, n);
    
        scanf("%d", &q);
        while (q--) {
            int c, l, r;
            scanf("%d%d%d", &c, &l, &r);
            if (l > r) swap(l, r); /// l可能大于r
            if (c == 0)
                modify(1, l, r);
            else
                printf("%lld\n", query(1, l, r));
        }
        printf("\n");
        return 0;
    }
    
  • 相关阅读:
    Nearest Excluded Points ( 转化思想 +多源BFS )
    Tower Defense (分块+差分的差分+优化空间方法, 主席树做法待补)
    mac 安装 vue环境及遇到的报错
    导出excel数据
    Git安装及gitlab 环境配置
    docker engine dockercompose部署
    python实现比较2个excel
    pytest conftest
    javascript 高阶函数
    jmeter 系统的笔记整理【持续更新】
  • 原文地址:https://www.cnblogs.com/littlehb/p/16202116.html
Copyright © 2020-2023  润新知