UESTC 1073 单点更新

原创 2015年11月19日 00:05:06

秋实大哥与线段树

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;
}


版权声明:本文为博主原创文章,你若想转载请附上源博客地址。

相关文章推荐

EOJ——Problem #3291——素数个数排序

素数个数排序 Time limit per test: 1.0 seconds Memory limit: 256 megabytes 设p(x, y)表示x到y之间的素数个数(...

秋实大哥与线段树 UESTC - 1073

秋实大哥与线段树 UESTC - 1073Problem“学习本无底,前进莫徬徨。” 秋实大哥对一旁玩手机的学弟说道。秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构。为了检验自己的掌握程...

UESTC 1073 秋实大哥与线段树 线段树&&改值与区间和 or 树状数组

“学习本无底,前进莫徬徨。” 秋实大哥对一旁玩手机的学弟说道。 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构。 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作。...

zoj 3633 线段树单点更新 区间最大值

/* 解法是,先把所有数字从小到大排序,相同的按出现的先后顺序排序。 更新时,对于每一个数x,如果前面的y==x的话,那么在线段树中,在x的坐标位置上赋值上y的坐标位置。 查询时,[a,b]就是查询区...

线段树专题#6_蒟蒻训练历程记录_HDU 2705 Billboard_单点更新

这道题,很水的啦。。然而楼猪制杖,真的宛若制杖,居然把向上更新的函数写成了两个子节点的和,WA了几发愣是没有发现。。。ORZ制杖专卖,假一罚十!              唯一的坑点就是必须现在公告...

POJ 2828 Buy Tickets【线段树单点更新+逆序遍历】【经典题】【模板题】

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 20782   A...
  • Archger
  • Archger
  • 2017年08月07日 20:21
  • 103

poj 2828 Buy Tickets(动态队列·线段树单点更新)

题目:http://poj.org/problem?id=2828 大意:一群人排队,第i个人来到队伍中站到处于posi的人的右边,且每个人都有不同的表示值,问最终的结果? Sample Input...

hdu1754——I Hate It(线段树,单点更新,求最大值)

Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按...

hdu 1166 单点更新

hdu敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UESTC 1073 单点更新
举报原因:
原因补充:

(最多只允许输入30个字)