`

士兵杀敌(五) 树状数组,线段树,标记数组(变区间,问区间)

 
阅读更多

连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=228

士兵杀敌(五)

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
 
描述

南将军麾下有百万精兵,现已知共有M个士兵,编号为0~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情。

 

在这样的情况下,南将军却经常会在许多次战役之后询问军师小工第i号士兵到第j号士兵所有人的总军功数。

请你帮助军师小工回答南将军的提问。

 

 
输入
只有一组测试数据
第一行是三个整数N,C,Q(1<=N,C,Q<=1000000),其中N表示士兵的总数。
随后的C行,每行有三个整数Mi,Ni,Ai(0<=Mi<=Ni<=N,0<=Ai<=100),表示从第Mi号到第Ni号士兵所有人平均增加了Ai的军功。
再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
输出
请对每次询问输出m号士兵到第n号士兵的总军功数,由于该数值可能太大,请把结果对10003取余后输出
样例输入
5 3 2
1 3 2
2 4 1
5 5 10
1 5
2 3
样例输出
19
6

 

 

#include<stdio.h>
int bing[1000010];
int MAX;
void add(int a,int b,int c)
{
	int n;
	n=a-1;
	while(n>0)
	{
		bing[n]-=c;
		n-=(n&(-n));
	}
	n=b;
	while(n>0)
	{
		bing[n]+=c;
		n-=(n&(-n));
	}
}
int chazhao(int a,int b)
{
	int totle=0,i,n,term;
	for(i=a;i<=b;i++)
	{
		n=0;term=i;
		while(term<MAX)
		{
			n+=bing[term];
			term+=(term&(-term));
		}
		totle+=n;
	}
	return(totle);
}
int main()
{
	int cc,q;
	int a,b,c;
	scanf("%d%d%d",&MAX,&cc,&q);
	while(cc--)
	{
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
	}
	while(q--)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",chazhao(a,b)%10003);
	}
	return(0);
}

 

 

 

#include<stdio.h>
struct Bing
{
	int l;
	int r;
	int date;
}bing[3*1000000];
void build(int a,int b,int n=1)
{
	bing[n].l=a;
	bing[n].r=b;
	bing[n].date=0;
	if(a==b)return;
	int zhong=(a+b)>>1;
	build(a,zhong,2*n);
	build(zhong+1,b,2*n+1);
}
void add(int a,int b,int c,int n=1)
{
	int zhong;
	if(bing[n].l==a&&bing[n].r==b)
	{
		bing[n].date+=c;
		return;
	}
	else
	{
		zhong=(bing[n].l+bing[n].r)>>1;
		if(b<=zhong)add(a,b,c,2*n);
		else if(a>zhong)add(a,b,c,2*n+1);
		else
		{
			add(a,zhong,c,2*n);
			add(zhong+1,b,c,2*n+1);
		}
	}
}
void find(int a,int b,int &c,int n=1)
{
	if(n==1)c=0;
	c+=bing[n].date*(b-a+1);
	if(bing[n].l==bing[n].r)return;
	int zhong=(bing[n].l+bing[n].r)>>1;
	if(b<=zhong)find(a,b,c,2*n);
	else if(a>zhong)find(a,b,c,2*n+1);
	else
	{
		find(a,zhong,c,2*n);
		find(zhong+1,b,c,2*n+1);
	}
}
int main()
{
	int aa,bb,cc;
	int n,c,q;
	scanf("%d%d%d",&n,&c,&q);
	build(1,n+1,1);
	while(c--)
	{
		scanf("%d%d%d",&aa,&bb,&cc);
		add(aa+1,bb+1,cc);
	}
	while(q--)
	{
		scanf("%d%d",&aa,&bb);
		find(aa+1,bb+1,cc);
		printf("%d\n",cc%10003);
	}
	return(0);
}

 

 

#include<stdio.h>
int p[1000010];
int main()
{
	int n,c,q;
	int a,b,cc;
	int i;
	scanf("%d%d%d",&n,&c,&q);
	while(c--)
	{
		scanf("%d%d%d",&a,&b,&cc);
		p[a]+=cc;
		p[b+1]-=cc;
	}
	for(i=1;i<=n;i++)
		p[i]+=p[i-1];
	for(i=1;i<=n;i++)
		p[i]=(p[i-1]+p[i])%10003;
	while(q--)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",(p[b]-p[a-1]+10003)%10003);
	}
	return(0);
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    线段树与树状数组及其在不同场合的使用

    线段树是一种树形数据结构,用于对一个连续的区间进行操作,如求和、查找最大值或最小值等。它将区间分为左子树和右子树,并递归地存储子区间的最大值、最小值或其他信息。线段树的每个节点都对应一个区间,根节点...

    线段树和树状数组入门介绍

    线段树和树状数组是两种在ACM(算法竞赛)和编程中广泛使用的高效数据结构,它们主要用于处理数组上的区间查询和修改操作。这里我们将深入理解这两种数据结构的原理和应用。 首先,线段树是一种能够支持动态维护...

    线段树和树状数组讲解课件

    与线段树不同,树状数组基于数组实现,而非树形结构。每个元素在数组中对应一个区间,通过前缀和的概念,可以快速查询到某个位置之前所有元素的累计值。对于区间更新,可以通过“反向传播”的方式,将更新从目标位置...

    线段树与树状数组专题讲解

    线段树和树状数组是两种在计算机科学和算法设计中常见的数据结构,它们主要用于高效地处理区间查询和更新操作。这两种数据结构在解决动态规划、最值查询、区间求和等问题时尤其有用。 线段树(Segment Tree): 1....

    高级数据结构(并查集、树状数组、线段数)

    **高级数据结构:并查集、树状数组与线段树** 在计算机科学中,高效的数据结构对于优化算法性能至关重要。本资料包聚焦于三种高级数据结构:并查集(Disjoint Set)、树状数组(Fenwick Tree,也称为BIT - Binary ...

    线段树 树状数组 数据结构

    ### 线段树与树状数组:高级数据结构在算法竞赛中的应用 #### 一、线段树 **线段树**是一种用于处理区间问题的高效数据结构,尤其适用于区间查询和区间更新等问题。线段树的核心在于利用二叉树的方式对区间进行...

    ACM数据结构之树状数组和线段树

    ### ACM数据结构之树状数组和线段树 #### 线段树 线段树是一种非常有效的数据结构,主要用于解决区间查询问题。它能够快速地处理区间内的各种操作,如查询、修改等。 ##### 线段树的定义与特性 线段树本质上是一...

    树状数组_洛谷_树状数组_

    树状数组,也被称为线段树(Segment Tree),是一种数据结构,主要用于高效地处理动态区间查询和修改问题。在编程竞赛和算法设计中,树状数组是解决许多问题的利器,尤其是在面对需要频繁更新和查询区间信息的问题时...

    线段树树状数组课件(ppt)

    线段树&树状数组课件 树状数组&线段树是最基本的高级数据结构之二 一般出现于较难题中 应用广泛,可用于直接写正解/把暴力改进成正解/拿大量部分分

    7.14 数据结构(一): 线段树,树状数组,二维线段树

    - **树形结构**:线段树本质上是一棵二叉树。 - **区间表示**:树中的每个节点都对应一个区间,如 `[a, b]`,其中 `a` 和 `b` 通常是整数。 - **叶子节点**:叶子节点代表单个元素或单位区间,长度为1。 - **内部...

    树状数组&线段树.pptx

    树状数组和线段树是两种在计算机科学中用于高效处理区间或段上数据更新与查询的数据结构。它们主要用于动态维护一个序列上的前缀和(区间和)问题,即在序列上进行插入、删除和查询操作时保持区间的和。 **树状数组...

    poj 2352 stars(树状数组,线段树)

    ### POJ 2352 Stars - 树状数组与线段树实现 #### 题目背景 POJ 2352 Stars 是一道经典的算法题目,它提供了使用树状数组或线段树来解决的可能性。这两种数据结构都是为了高效处理区间查询问题而设计的。在这篇...

    算法NOIP树状数组校门外的树.pdf

    树状数组的核心思想是通过特定的二进制索引操作,将一个一维数组转化为类似树形的数据结构,进而利用这种结构简化更新和查询操作。 在树状数组中,我们不直接维护前缀和数组S[],而是将其划分为若干个小区间和,并...

    线段树和树状数组——北京大学暑期课《ACM/ICPC竞赛训练》

    ### 线段树与树状数组:北京大学暑期课《ACM/ICPC竞赛训练》 #### 线段树概述 线段树是一种高效的数据结构,主要用于处理区间查询和区间更新问题。它通过将一个大的区间细分成若干个较小的不重叠的子区间来实现...

    C++代码实例 - 线段树+树状数组.zip

    与线段树不同,树状数组基于数组而非树形结构,它利用前缀和的性质,通过位操作快速计算区间和。每个数组元素存储了以该位置为右端点的所有前缀和的增量。插入和查询操作同样能在O(log n)的时间内完成。相比于线段树...

    树状数组树状数组资料下载

    在实际应用中,如“密码机”这类问题,树状数组可以替代线段树来处理异或操作,因为异或操作同样满足交换律和结合律,这使得树状数组能有效地处理这类问题,降低了算法的实现难度。 总的来说,树状数组是一种强大的...

    详细的数据结构延伸介绍(包括AC自动机SBT,伸展树,字典树,并查集,笛卡尔树,二叉堆,斐波那契堆,哈希表,红黑树,后缀树,后缀数组,树状数组,线段树,左偏树,斜堆)

    详细的数据结构延伸介绍(包括AC自动机SBT,伸展树,字典树,并查集,笛卡尔树,二叉堆,斐波那契堆,哈希表,红黑树,后缀树,后缀数组,树状数组,线段树,左偏树,斜堆),自己整理和归纳相当长的时间,里面有网上的资料,牛人的...

    基于C++的线段树和树状数组(免费提供全部源码)

    本项目旨在利用C++语言实现线段树和树状数组,以解决在计算机科学和工程中的区间查询和修改问题。线段树和树状数组是处理静态和动态区间操作的高效数据结构,广泛应用于数据分析、图像处理和游戏开发等领域。 模块...

    树状数组详解

    在给定的题目中,我们可以通过树状数组来快速响应南将军的各种查询,包括计算一段区间内士兵的总杀敌数以及在特定位置更新杀敌数。 首先,理解树状数组的基本思想:它将一个数组通过位运算重新组织,使得每个节点...

    树状数组资料

    树状数组,也被称为线段树(Segment Tree),是一种数据结构,主要应用于处理区间查询与更新问题,在计算机科学,特别是算法竞赛(如ACM/ICPC)中有着广泛的应用。这个压缩包文件“树状数组资料”很可能包含了关于...

Global site tag (gtag.js) - Google Analytics