hdu 1698 线段树 懒惰标记

文章回顾了作者近期的学习状态,强调了即将到来的专业课程学习的重要性,并分享了正在努力学习Java和应对任务挑战的过程。文章中提到了解决区间赋值问题的方法,涉及构建树和区间查找等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嗯。。好久没做题了,最近都在忙期末啊。。下学期开始要认真学习了,毕竟开始学专业课了,应该蛮有意思的吧。最近压力好大,真的好大,好好学java,争取拿下大鹏给的任务!!


题意:

就是一个区间,每个点初始值为1,然后有q个操作,x y z,代表x到y的区间每个点赋值为z。

题解:

对每个要重新赋值的区间,去寻找并标记,寻找的时候注意下拉已经标记的区间。最后再总的去找一遍多少值。

#include<stdio.h>
#include<string.h>
int cas,l,q,tree[300001],flag[300001];
void buildtree(int lf,int rt,int pos){
//	tree[pos]=0;
	flag[pos]=0;
	if(lf==rt){
		tree[pos]=1;
		return ;
	}
	int mid=(lf+rt)/2;
	buildtree(lf,mid,pos*2);
	buildtree(mid+1,rt,pos*2+1);
	return ;
}
void find(int left,int right,int lf,int rt,int value,int pos){
	if(flag[pos]){
		flag[pos*2]=flag[pos*2+1]=flag[pos];
		flag[pos]=0;
	}
	if(left==lf&&right==rt){
		flag[pos]=value;
		return;
	}
	int mid=(left+right)/2;
	if(rt<=mid){
		find(left,mid,lf,rt,value,pos*2);
		return ;
	}
	else if(lf>mid){
		find(mid+1,right,lf,rt,value,pos*2+1);
		return;
	}
	else{
		find(left,mid,lf,mid,value,pos*2);
		find(mid+1,right,mid+1,rt,value,pos*2+1);
		return;
	}
}
int getit(int lf,int rt,int pos){
	if(flag[pos]){
		return (rt-lf+1)*flag[pos];
	}
	if(lf==rt){
		return 1;
	}
	else{
		int mid=(lf+rt)/2;
		return getit(lf,mid,pos*2)+getit(mid+1,rt,pos*2+1);
	}
}
int main(){
	scanf("%d",&cas);
	int it=0;
	while(it++<cas){
		scanf("%d%d",&l,&q);
		buildtree(1,l,1);
		for(int i=1;i<=q;i++){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			find(1,l,x,y,z,1);
		}
//		printf("!!\n");
		printf("Case %d: The total value of the hook is %d.\n",it,getit(1,l,1));
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值