HDU 1698 Dota钩子问题-线段树-(区间替换,查询总和)

题意:一段挂钩分成n段,每一段可以由铜、银、金做成,对应的价值分别是1,2,3,现在有m个操作(a,b,x)意思是改变区间[a,b]段的钩子为材质x,问m个操作之后这段挂钩的价值总和。挂钩的每一段初始为铜,也就是1。

分析:

区间更新,单点查询。确切的说是区间替换,询问总区间总和。线段树的典型应用之一。因为是区间更新,所以用 lazy[rt] 数组记录当前子树是否曾经更新过,lazy[rt]!=-1表示在本操作之前就已经替换过rt代表的子区间的值,那么需要把上次的更新操作向下执行完。详见注释。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100000;
int t,n,q;
int sum[maxn*4+10];
int lazy[maxn*4+10];
void pushup(int rt)
{
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void creat(int l,int r,int rt)
{
	lazy[rt]=-1;
	if(l==r){    //l==r表示当前区间是元区间也就是一个点,在本题中表示某一段
		sum[rt]=1;  //根为rt的区间的总和
		return;
	}
	int mid=(l+r)>>1;
	creat(l,mid,rt<<1);
	creat(mid+1,r,rt<<1|1);
	pushup(rt);   //建好子树之后向上求区间和
}
void pushdown(int d,int rt)
{
	if(lazy[rt]!=-1){
		lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
		sum[rt<<1]=(d-(d>>1))*lazy[rt];
		sum[rt<<1|1]=(d>>1)*lazy[rt];
		lazy[rt]=-1;
	}
}
void upd(int a,int b,int x,int l,int r,int rt)
{
	if(a<=l&&b>=r){  //如果要更新的区间包含整个区间,那么不用向下更新,直接用区间长度乘以替换的值得到区间总和
		lazy[rt]=x;  //但是下次更新的区间可能只是整个区间的子区间,那么不把这次替换的值更新下次就丢失了这次的数据
		sum[rt]=(r-l+1)*x; //所以用lazy[rt]=x 记录这次有个操作是更新了rt代表的区间的值为x,下次如果更新操作不再包含整个区间而是
		return;                //整个区间的子区间,未免数据丢失,先取出lazy[rt]的x,把x向下更新了。然后再执行本次操作
	}
	pushdown(r-l+1,rt);  //取出lazy[rt]执行上次的更新操作
	int mid=(l+r)>>1;     //然后执行本次操作
	if(a<=mid) upd(a,b,x,l,mid,rt<<1);
	if(b>mid) upd(a,b,x,mid+1,r,rt<<1|1);
	pushup(rt);
}
int main()
{
	scanf("%d",&t);
	int cas=1;
	while(t--){
		scanf("%d%d",&n,&q);
		creat(1,n,1);
		while(q--){
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			upd(a,b,c,1,n,1);
		}
		printf("Case %d: The total value of the hook is %d.\n",cas++,sum[1]);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 11:55:17

HDU 1698 Dota钩子问题-线段树-(区间替换,查询总和)的相关文章

HDU 1698 Just a Hook(线段树区间替换)

题目地址:HDU 1698 区间替换裸题.同样利用lazy延迟标记数组,这里只是当lazy下放的时候把下面的lazy也全部改成lazy就好了. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #in

[HDU] 1698 Just a Hook [线段树区间替换]

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18378    Accepted Submission(s): 9213 Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing f

HDU 1698 Just a Hook (线段树,区间更新)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17214    Accepted Submission(s): 8600 Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible thing f

HDU 1698 Just a Hook (线段树 区间更新基础)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21856    Accepted Submission(s): 10963 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing

hdu 1698 Just a Hook 线段树区间更新

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 Let us number the consecutive metallic sticks of the hook from 1 to N. For each operation, Pudge can change the consecutive metallic sticks, numbered from X to Y, into cupreous sticks, silver sticks

(简单) HDU 1698 Just a Hook , 线段树+区间更新。

Description: In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length. Now Pudge wants to do some operations on the hook

HDU - 1698 Just a Hook(线段树区间整体修改值,查询区间和)

In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length. Now Pudge wants to do some operations on the hook. Let us numb

HDU 1698 Just a Hook 线段树区间更新、

来谈谈自己对延迟标记(lazy标记)的理解吧. lazy标记的主要作用是尽可能的降低时间复杂度. 这样说吧. 如果你不用lazy标记,那么你对于一个区间更新的话是要对其所有的子区间都更新一次,但如果用lazy标记的话. 就只需要更新这一个区间然后加一个标记,那么如果要访问这个区间的子区间,因为有lazy标记,所以下次访问会将区间的lazy标记传递给子区间,让后去更新子区间,这样我们不必在每次区间更新操作的时候更新该区间的全部子区间,等下次查询到这个区间的时候只需要传递lazy标记就可以了 但从时

HDU 1698 Just a Hook (线段树区间更新)

Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. The hook is made up of several consecutive metallic sticks which are of the same length. Now Pudge wants to do some operations on t