UVA12086 Potentionmeters 线段树

来源:互联网 发布:毕向东java视频下载 编辑:程序博客网 时间:2024/05/16 15:00

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 Npotmeters, numbered1 to N from left to right. The left terminal of some potmeter numberedx is connected to the right terminal of potmeter x-1, and its right terminal to the left terminal of potmeterx+1. The left terminal of potmeter 1 and the right terminal of potmeterNare 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 order1 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 andx 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 Output for 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

 

Case 1:

100

300

300

200

Case 2:

55



















卡题严重时要切切水题找状态敲打

线段树版本:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 2000080#define lson id<<1,l,mid#define rson id<<1|1,mid+1,rint key[maxn];struct ST{int l,r,sum;}st[maxn<<2];void PushUp(int id){st[id].sum = st[id<<1].sum + st[id<<1|1].sum;}void buildtree(int id,int l,int r){st[id].l = l;st[id].r = r;if(l == r){st[id].sum = key[l];return;}int mid = (l+r) >> 1;buildtree(lson);buildtree(rson);PushUp(id);}void Update(int id,int pos,int k){if(st[id].l == pos && st[id].r == pos){st[id].sum = k;return;}if(st[id<<1].r >= pos)Update(id<<1,pos,k);else if(st[id<<1|1].l <= pos)Update(id<<1|1,pos,k);PushUp(id);}int query(int id,int l,int r){if(st[id].l == l && st[id].r == r)return st[id].sum;if(st[id<<1].r >= r)return query(id<<1,l,r);else if(st[id<<1|1].l <= l)return query(id<<1|1,l,r);return query(id<<1,l,st[id<<1].r) + query(id<<1|1,st[id<<1|1].l,r);}int main(){//freopen("in.txt","r",stdin);int n,cas = 0;while(scanf("%d",&n)!=EOF && n){if(cas)printf("\n");cas++;for(int i = 1;i <= n;i++)scanf("%d",&key[i]);buildtree(1,1,n);char ope[4];int u,v;printf("Case %d:\n",cas);while(1){scanf("%s",ope);if(ope[0] == 'M'){scanf("%d%d",&u,&v);printf("%d\n",query(1,u,v));}else if(ope[0] == 'S'){scanf("%d%d",&u,&v);Update(1,u,v);}else break;}}return 0;}


树状数组版本:似乎TLE 了???纯当练手闭嘴

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 200080int c[maxn];int n;int lowbit(int x){return x&(-x);}int query(int x){int ans = 0;while(x > 0){ans += c[x];x -= lowbit(x);}return ans;}void update(int x,int set){int u = x,add = 0;while(u <= n){if(u == x){add = set - (query(u) - query(u-1));}c[u] += add;u += lowbit(x);}}int main(){//freopen("in.txt","r",stdin);int cas = 0;while(scanf("%d",&n)!=EOF && n){memset(c,0,sizeof(c));if(cas) printf("\n");cas++;for(int i = 1;i <= n;i++){int key;scanf("%d",&key);update(i,key);}char ope[4];int u,v;printf("Case %d:\n",cas);while(1){scanf("%s",ope);if(ope[0] == 'M'){scanf("%d%d",&u,&v);printf("%d\n",query(v) - query(u-1));}else if(ope[0] == 'S'){scanf("%d%d",&u,&v);update(u,v);}else break;}}return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 t恤袖子长了怎么办 t恤袖子短了怎么办 ofo突然要交押金余款怎么办 裙子的腰小了怎么办 白衬衣棉质变软怎么办? 车被自行车刮了怎么办 刮花别人的车门怎么办 破腹产九个月意外怀孕怎么办 破腹产一年半意外怀孕怎么办 37天流产了该怎么办 旧鞋穿着磨脚了怎么办 皮鞋磨脚怎么办小窍门 拉链从下面开了怎么办 高帮足球鞋松了怎么办 橡筋裤头太紧了怎么办 内增高鞋跟太高怎么办 电脑增高架高了怎么办 银行取钱走后回来说少了怎么办 运动t桖太大了怎么办 袖口松紧太紧了怎么办 衣服穿着就皱了怎么办 麻料的衣服很皱怎么办 麻料衣服皱了怎么办 棉麻裤子皱了怎么办 裙子屁股坐皱了怎么办 真丝衣服洗皱了怎么办 粘纤的衣服皱了怎么办 硅胶手机壳粘灰怎么办 橡筋裤子买大了怎么办 橡筋裤子腰小了怎么办 地垫粘瓷砖上怎么办 汽车围裙锈透了怎么办 万能胶水沾到手上怎么办 圆领体恤领口容易皱怎么办 上衣剪了个洞怎么办 上衣破了个洞怎么办 鸟屎腐蚀车漆怎么办 毛风衣叠久了怎么办 黑色的衣服沾毛怎么办 雪纺裙子弄上油怎么办 内衣买小了怎么办妙招