关闭

UESTC 1073 单点更新

125人阅读 评论(0) 收藏 举报
分类:

秋实大哥与线段树

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

“学习本无底,前进莫徬徨。” 秋实大哥对一旁玩手机的学弟说道。

秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构。

为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作。

秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值;一种是询问一段区间的和。

Input

第一行包含一个整数n,表示序列的长度。

接下来一行包含n个整数ai,表示序列初始的元素。

接下来一行包含一个整数m,表示操作数。

接下来m行,每行是以下两种操作之一:

1 x v : 表示将第x个元素的值改为v
2 l r : 表示询问[l,r]这个区间的元素和

1nmvai1000001lrn

Output

对于每一个2 l r操作,输出一个整数占一行,表示对应的答案。

Sample input and output

Sample Input Sample Output
3
1 2 3
3
2 1 2
1 1 5
2 1 2
3
7

Source

2015 UESTC Training for Data Structures



单点更新,早就忘记了怎么更新于是造出了一个诡异的update函数
void update(int mi,int pos,int v,int rt)
{
	if(tree[rt].lc==tree[rt].rc&&tree[rt].lc==pos)
	{
		tree[rt].sum=v;
		return ;
	}
	int mid=(tree[rt].lc+tree[rt].rc)>>1;
	if(pos<=mid)update(mid,pos,v,rt<<1);
	else update(mid,pos,v,rt<<1|1);
	pushup(rt);
}

这里的mi参数不断与pos比较,一直二分查找到叶子节点,后来一想其实根本不用这样啊,只要一直保持递归pos,引导到目的节点,不需要mi变量尴尬


#include<iostream>
#include<cstdio>
using namespace std;
#define N 100005
#define LL long long 
struct point
{
	int lc,rc;
	LL sum;
}tree[N<<2];
LL sumr;
void pushup(int rt)
{
	tree[rt].sum=tree[(rt<<1)].sum+tree[(rt<<1|1)].sum;
}
void build(int L,int R,int rt)
{
	tree[rt].lc=L;
	tree[rt].rc=R;
	if(L==R)
	{
		scanf("%lld",&tree[rt].sum);
		return ;
	}
	int mid=(L+R)>>1;
	build(L,mid,rt<<1);
	build(mid+1,R,rt<<1|1);
	pushup(rt);
}
void update(int pos,int v,int rt)
{
	if(tree[rt].lc==tree[rt].rc&&tree[rt].lc==pos)
	{
		tree[rt].sum=v;
		return ;
	}
	int mid=(tree[rt].lc+tree[rt].rc)>>1;
	if(pos<=mid)update(pos,v,rt<<1);
	else update(pos,v,rt<<1|1);
	pushup(rt);
}
void query(int L,int R,int rt)
{
	if(L==tree[rt].lc&&R==tree[rt].rc)
	{
		sumr+=tree[rt].sum;
		return ;
	}
	int mid=(tree[rt].lc+tree[rt].rc)>>1;
	if(R<=mid)query(L,R,rt<<1);
	else if (L>mid)query(L,R,rt<<1|1);
	else
	{
		query(L,mid,rt<<1);
		query(mid+1,R,rt<<1|1);
	}
}
int main()
{
#ifdef CDZSC
	freopen("i.txt","r",stdin);
#endif
	int n,m,x,y,k;
	while(~scanf("%d",&n))
	{
		build(1,n,1);
		scanf("%d",&m);
		while(m--)
		{
			scanf("%d%d%d",&k,&x,&y);
			if(k==1)
			{
				update(x,y,1);
			}
			else
			{
				sumr=0;
				query(x,y,1);
				printf("%lld\n",sumr);
			}
		}
	}
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:137604次
    • 积分:5543
    • 等级:
    • 排名:第4739名
    • 原创:417篇
    • 转载:109篇
    • 译文:0篇
    • 评论:24条
    Gayhub--同性交友
    https://github.com/qq1367212627
    最新评论