Potentiometers (树状数组)

本文介绍了树状数组(Potentiometers)的概念及其在电子设备中作为可变电阻的应用。内容涉及电阻串联时总电阻的计算,并给出了一种包含多个可调电阻的阵列问题,其中可以设置电阻值或测量任意两点间的电阻。问题要求处理一系列操作,包括单个电阻的更新和电阻测量。案例分析展示了如何使用树状数组解决此类问题,包括单点更新和区间求和的实现。
摘要由CSDN通过智能技术生成

A potentiometer, or potmeter for short, is an electronic device with a variable electric resistance. It
has two terminals and some kind of control mechanism (often a dial, a wheel or a slide) with which the
resistance between the terminals can be adjusted from zero (no resistance) to some maximum value.
Resistance is measured in Ohms, and when two or more resistors are connected in series (one after the
other, in a row), the total resistance of the array is the sum of the resistances of the individual resistors.
In this problem we will consider an array of N potmeters, numbered 1 to N from left to right. The
left terminal of some potmeter numbered x is connected to the right terminal of potmeter x − 1, and
its right terminal to the left terminal of potmeter x + 1. The left terminal of potmeter 1 and the right
terminal of potmeter N are not connected.
Initially all the potmeters are set to some value between 0 and 1000 Ohms. Then we can do two
things:
• Set one of the potmeters to another value.
• Measure the resistance between two terminals anywhere in the array.
Input
The input consists less than 3 cases. Each case starts with N, the number of potmeters in the array,
on a line by itself. N can be as large as 200000. Each of next N lines contains one numbers between 0
and 1000, the initial resistances of the potmeters in the order 1 to N. Then follow a number of actions,
each on a line by itself. The number of actions can be as many as 200000. There are three types of
action:
• “S x r” - set potmeter x to r Ohms. x is a valid potmeter number and r is between 0 and 1000.
• “M x y” - measure the resistance between the left terminal of potmeter x and the right terminal
of potmeter y. Both numbers will be valid and x is smaller than or equal to y.
• “END” - end of this case. Appears only once at the end of a list of actions.
A case with N = 0 signals the end of the input and it should not be processed.
Output
For each case in the input produce a line ‘Case n:’, where n is the case number, starting from 1.
For each measurement in the input, output a line containing one number: the measured resistance
in Ohms. The actions should be applied to the array of potmeters in the order given in the input.
Print a blank line between cases.
Warning: Input Data is pretty big (∼ 8 MB) so use faster IO.
Sample Input
3
100
100
100
M 1 1
M 1 3
S 2 200
M 1 2
S 3 0
M 2 3
END
10
1
2
3
4
5
6
7
8
9
10
M 1 10
END
0
Sample Output
Case 1:
100
300
300
200
Case 2:
55

题目大概:

给你n个数,不定条询问,询问可以单点更新,也可以区间求和。

思路:

树状数组,单点更新,区间求和的模板题。

代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn=2e5+10;
int c[maxn];
int N;
int lowbit(int x)
{
    return x&(-x);
}

void add(int x,int v)
{
    while(x<=N)
    {
        c[x]+=v;
        x+=lowbit(x);
    }

}
int sum(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
int main()
{
    int ans=0;
    while(~scanf("%d",&N)&&N)
    {
    memset(c,0,sizeof(c));
    int u;
    for(int i=1;i<=N;i++)
    {
        scanf("%d",&u);
        add(i,u);
    }
    char q[5];
    if(ans)printf("\n");
    printf("Case %d:\n",++ans);
   while(scanf("%s",q))
   {
       if(q[0]=='E')break;
       if(q[0]=='S')
       {
           int id,w2;
           scanf("%d%d",&id,&w2);
           int w=sum(id)-sum(id-1);
           int cha=w2-w;
           add(id,cha);
       }
       else
       {
           int l,r;
            scanf("%d%d",&l,&r);
            int w=sum(r)-sum(l-1);
            printf("%d\n",w);
       }
    }

    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值