chuninsane

UVALive 2191 Potentiometers (树状数组)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=192

给你一个长度为n的数组A,有两种操作,操作一:(S x y) 将A[x]的大小置为y,操作二:(M x y) 求A[x], A[x+1] ... A[y]的和

用一个额外的数组tmp存储数组A,然后将 S x y转换为树状数组的 add x y-tmp[x]

复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 200010
using namespace std;

typedef long long LL;

LL c[maxn];
int n, arr[maxn];

int lowbit(int x);

void add(int x, int u);

LL sum(int x);

int main(void)
{
    int ca = 0;
    while (scanf("%d", &n), n)
    {
        memset( c, 0, sizeof(c));
        int x, y;
        char ope[10];
        for (int i = 1; i <= n; ++i)
        {
            scanf("%d", arr + i);
            add( i, arr[i]);
        }
        if (ca)
            putchar(10);
        printf("Case %d:\n", ++ca);
        while (scanf("%s", ope), ope[0] != 'E')
        {
            scanf("%d %d", &x, &y);
            if (ope[0] == 'S')
            {
                add( x, y - arr[x]);
                arr[x] = y;
            }
            else
            {
                printf("%lld\n", sum(y) - sum(x - 1));
            }
        }
    }
    return 0;
}

int lowbit(int x)
{
    return x&(-x);
}

LL sum(int x)
{
    LL result = 0;
    while (x > 0)
    {
        result += c[x];
        x -= lowbit(x);
    }
    return result;
}

void add(int x, int u)
{
    while (x <= n)
    {
        c[x] += u;
        x += lowbit(x);
    }
}
复制代码

 

posted on   chuninsane  阅读(214)  评论(0编辑  收藏  举报

编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

导航

统计信息

点击右上角即可分享
微信分享提示