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


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

秋实大哥与线段树 UESTC - 1073

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

树状数组的区间修改,单点查询

树状数组的区间修改
  • u013514722
  • u013514722
  • 2014年10月17日 21:49
  • 2656

UESTC 1634 记得小苹初见,两重心字罗衣 欧拉路径(回路)

题意:二维平面上有n个点,需要将每个点染成红色或蓝色. 要求设计一种染色方案能够使得每一行和每一列的红色的点的数量与蓝色的点的数量之差都不超过1。 欧拉路径(回路) 把每个点当作一条边来处理,横坐标x...
  • ProLightsfxjh
  • ProLightsfxjh
  • 2017年05月28日 15:24
  • 851

uestc 94(区间更新)

题意:有一个字符串全部由’(‘和’)’组成,然后有三种操作,query a b输出区间[a,b]字符串的括号序列是否合法,reverse a b把区间[a,b]字符串里所有’(‘替换成’)’,并且把所...
  • u013392752
  • u013392752
  • 2015年08月20日 02:15
  • 409

树状数组区间更新+区间查询+单点查询

树状数组时间复杂度为O(MlogN), 实际用的时候优于线段树,且写得少。 神牛是引入了差分数组,要维护的差分数组ks[i] = a[i] - a[i-1]; 可以容易得到a[i] = ks[1] ...
  • yo_bc
  • yo_bc
  • 2017年02月21日 15:36
  • 691

2017UESTC 数据结构专题题解

传送门 G题 题意:给出一个序列,支持单点修改,每次查询一个位置成等差数列中所有数的最大值。 思路:等差数列如果公差很大的话,那么整个数列中的数并不会很多;但是如果公差很小,我们就可以用线段树来...
  • guhaiteng
  • guhaiteng
  • 2017年05月10日 19:51
  • 258

线段树详解(单点更新与成段更新\区间更新操作)

本文纯属原创,转载请注明出处,谢谢。 距离第一次接触线段树已经一年多了,再次参加ACM暑假集训,这一次轮到我们这些老家伙们给学弟学妹们讲解线段树了,所以就自己重新把自己做过的题目看了一遍,然后写篇博客...
  • u014705673
  • u014705673
  • 2015年07月06日 15:57
  • 6302

C 杨辉三角(九度OJ 1073)

题目描述: 输入n值,使用递归函数,求杨辉三角形中各个位置上的值。 输入: 一个大于等于2的整型数n 输出: 题目可能有多组不同的测试数据,对于每组输入数据, 按题目的要求输出相应输入n...
  • cr496352127
  • cr496352127
  • 2016年10月01日 22:57
  • 228

pat解题报告【1073】

1073. Scientific Notation (20) 时间限制   100 ms 内存限制   32000 kB 代码长度限制   16000 B 判题程序    ...
  • linsheng9731
  • linsheng9731
  • 2014年08月10日 22:56
  • 915

UESTC 1652 都市大飙车

题目链接:http://acm.uestc.edu.cn/#/problem/show/1652 解法:多段图问题,用滚动数组,转移很好想。 概率DP 算法复杂度:O(N*M*log N) 用...
  • just_sort
  • just_sort
  • 2017年06月20日 19:29
  • 276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UESTC 1073 单点更新
举报原因:
原因补充:

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