hdu oj 1698 just a hook 线段树

5 篇文章 0 订阅
3 篇文章 0 订阅

题意分析:

一道有关线段树区间修改的入门题。线段树区间修改一般包含两个操作:设有一个数组Ai。1.把Ai,Ai+1,Ai+2....Ar的值全部添加v。2.把Ai,Ai+1,Ai+2....Ar的值全部修改成v.这道题考查的石第二个操作。如果你要是明白了线段树的点修改,这道题你看别人写的代码,你很容易就能明白。我就是一个活生生的例子大笑大笑。如果这道题你看明白了,我们可以想一下如果给你一道题,有关第一个操作的,我们该怎么做?我们可以在定义结构体的时候可以定义一个变量是求相对应的这段区间的和,还有一个变量是在这个区间经过几次的添添加加减减,最后这段区间最后要添加多少。PS:这几天HDU OJ登不上去了,我只是把代码敲下来了,不知道局部细节上面处理的怎么样,不知道能不能AC,但是大致思路肯定是对的。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
	int lc,rc;
	int val;
}s[1000000];
int a,b,c;
void build(int sta,int end,int index) {
	if(sta == end) {
		s[index].lc=sta;
		s[index].rc=end;
		s[index].val = 1;
		return ;
	}
	int mid=(sta+end)/2;
	s[index].val=1;
	s[index].lc=sta;
	s[index].rc=end;
	build(sta,mid,2*index);
	build(mid+1,end,2*index+1);
}
void updata(int lc,int rc,int index) {
	if(s[index].val == c) {
		return ;
	}
	if(s[index].lc==lc && s[index].rc==rc) {
		s[index].val = c;
		return ;
	}
	if(s[index].val) { 
		s[2*index].val=s[2*index+1].val=s[index].val;
	}
	s[index].val = 0;
	int mid = (s[index].rc+s[index].lc)>>1;
	if(rc<=mid) {
		updata(lc,rc,2*index);
	}
	else if(lc>mid) updata(lc,rc,2*index+1);
	else {
		updata(lc,mid,2*index);
		updata(mid+1,rc,2*index+1);
	}
}
int sum(int index) {
	if(s[index].val) return (s[index].rc-s[index].lc+1)*s[index].val;
	return sum(2*index)+sum(2*index+1);
}
int main() {
	int t,n,m,i;
	scanf("%d",&t);
	for(i=1; i<=t; i++) {
		
		scanf("%d%d",&n,&m);
		build(1,n,1);
		for(int j=0; j<m; j++) {
			cin>>a>>b>>c;
			updata(a,b,1);
		}
		printf("Case %d: The total value of the hook is %d.\n",i,sum(1));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值