HDU 4027 Can you answer these queries?(线段树 区间不等更新)

https://vjudge.net/problem/HDU-4027#author=SUDA2019

题意 输入n个数 然后有两种操作 输入0时将给定区间所有数都变为自己的开方 输入1输出给定区间所有数的和

虽然是区间更新 但每个点更新的不一样 因此只能对单点进行更新 其实一个点最多被更新7次 264 开平方7次后就变为1了 如果某个区间的数都变为了1 那么对这个区间的开方就不用考虑了 另外要注意给你的区间可能是反的

#include<bits/stdc++.h>
typedef long long ll;
#define mid (l+r)/2
#define lch in*2
#define rch in*2+1
const int maxn = 1e5 + 9;
int N, M, L, R;
ll tr[maxn * 4] = {};
void build(int in = 1, int l = 1, int r = N) {
    if (l == r) return void(scanf("%lld", tr + in));
    build(lch, l, mid); build(rch, mid + 1, r);
    tr[in] = tr[lch] + tr[rch];
}
void update(int in = 1, int l = 1, int r = N) {
    if (l > R || r < L || tr[in] == (r - l + 1)) return;
    if (l == r) return void(tr[in] = sqrt(tr[in]));
    update(lch, l, mid); update(rch, mid + 1, r);
    tr[in] = tr[lch] + tr[rch];
}
ll qurry(int in = 1, int l = 1, int r = N) {
    if (l > R || r < L) return 0;
    if (L <= l && R >= r) return tr[in];
    return qurry(lch, l, mid) + qurry(rch, mid + 1, r);
}
void solve() {
    build();
    scanf("%d", &M);
    while (M--) {
        int t; scanf("%d%d%d", &t, &L, &R);
        if (L > R) L ^= R ^= L ^= R;
        if (!t) update();
        else printf("%lld\n", qurry());
    }
}
int main() {
    //freopen("in.txt", "r", stdin);
    for (int __ = 1; ~scanf("%d", &N);) {
        printf("Case #%d:\n", __++);
        solve();
        puts("");
    }
}
posted @   RioTian  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示