hdu 4970 Killing Monsters

题目大意:

怪物在一条直线上运动,怪物i都是从xi(坐标)移到到n去,怪物每秒前进一格。在直线上有m个防御塔,每个防御塔有个攻击范围L-R,每秒防御塔能攻击所有处于L-R之间的怪物。

给你K个怪物,怪物i的血量为Hi,初始坐标为Xi

求最后存活了多少个怪物

 

方法一:

               用段树区间维护求出每个点所受的伤害再统计最后存活的怪物即可,但是会TLE,  不过用了输入外挂后能AC  0.5S(以前某渣知道这个东西的好处)

方法二:

             直接用一个一维数组去维护区间伤害值的更新,对于了l,r,d 则a[l]+= d,a[r-1]+=d , 第i个位置的伤害就是数组a的1-i的前缀和

            然后再从后往前累计一次就可以得到第i个位置会受到的最大伤害值

            PS: 感觉这个维护区间伤害的方法有点吊。。。  我想都没想都写线段树了。。

线段树代码:

//线段树 
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
#define LL __int64	
#define maxn 100005

struct nofr
{
	int l, r;
	LL add;
}a[4*maxn];

LL s[maxn];

void Build(int l, int r, int n)
{
	a[n].l= l;
	a[n].r= r;
	a[n].add= 0;
	if(a[n].l== a[n].r)
		return;
	int mid= (a[n].l + a[n].r)/2;
	Build(l, mid, 2*n);
	Build(mid+1, r, 2*n+1);	
}

void pushdown(int n)
{
	if(a[n].add)
	{
		if(a[n].l== a[n].r)
			return;
		a[2*n].add+= a[n].add;
		a[2*n+1].add+= a[n].add;
		a[n].add= 0;	
	}
}

void add(int l, int r, int n, int d)
{
	pushdown(n);
//	printf("%d %d %d ",a[n].l,a[n].r,n);
	if(a[n].l== l && a[n].r== r)
	{
		a[n].add+= d;
		return;
	}
	int mid= (a[n].l + a[n].r)/ 2;
//	printf("%d %d %d\n",l,r,mid);
	if(r<= mid)
		add(l, r, 2*n, d);
	else if(l> mid)
		add(l, r, 2*n+1, d);
	else
	{
		add(l, mid, 2*n, d);
		add(mid+1, r, 2*n+1, d);
	}		
}

void Query(int n, LL sum)
{
	//printf("%d\n",n);
	sum+= a[n].add;
	if(a[n].l== a[n].r)
	{
		s[a[n].l]= sum;
		return;
	}
	Query(2*n, sum);
	Query(2*n+1, sum);
}

int get_val()
{
 int ret=0;
 char c;
 while((c=getchar())!=' '&&c!='\n')
  ret=ret*10+c-'0';
 return ret;
}

LL g_val()
{
 LL ret=0;
 char c;
 while((c=getchar())!=' '&&c!='\n')
  ret=ret*10+c-'0';
 return ret;
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF&& n)
	{
		getchar();
		Build(1, n, 1);
		int m;
		//scanf("%d",&m);
		m= get_val();
		while(m--)
		{
			int l, r, d;
			//scanf("%d %d %d",&l,&r,&d);
			l= get_val();
			r= get_val();
			d= get_val();
			add(l, r, 1, d);
		}
		memset(s, 0, sizeof(s));
		Query(1, 0);
		for(int i= n; i>= 1; i--)
			s[i]+= s[i+1];
		int k; 
		int ans= 0;
		//scanf("%d",&k);
		k= get_val();
		while(k--)
		{
			LL hi;
			int xi;
			//scanf("%I64d",&hi);
			hi= g_val();
			//scanf("%d",&xi);
			xi= get_val();
			if(s[xi]< hi)
				ans++;	
		}
		printf("%d\n",ans);
	}
	return 0;
}


代码二:

#include <cstdio>
#include <cstring>
#define maxn 100005
#define LL __int64

LL s[maxn];

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF&&n)
	{
		memset(s, 0, sizeof(s));
		int m;
		scanf("%d",&m);
		while(m--)
		{
			int l, r, d;
			scanf("%d %d %d",&l,&r,&d);
			s[l]+= d;
			s[r+1]-= d;
		}
		for(int i= 1; i<= n; i++)
			s[i]+= s[i-1];
		for(int i= n-1; i>= 1; i--)
			s[i]+= s[i+1];
		int k;
		int ans= 0;
		scanf("%d",&k);	 
		while(k--)
		{
			LL hi;
			int xi;
			scanf("%I64d %d",&hi,&xi);
			if(s[xi]< hi)
				ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
} 


 

            

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值