ny 123 士兵杀敌(四)-- 线段树(区间更新,单点查询)

士兵杀敌(四)

时间限制:2000 ms  |  内存限制:65535 KB

难度:5

描述

南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情,军师小工的任务就是在南将军询问他某个人的军功的时候,快速的报出此人的军功,请你编写一个程序来帮助小工吧。

假设起始时所有人的军功都是0.

输入
只有一组测试数据。

每一行是两个整数T和M表示共有T条指令,M个士兵。(1<=T,M<=1000000)

随后的T行,每行是一个指令。

指令分为两种:

一种形如

ADD 100 500 55 表示,第100个人到第500个人请战,最终每人平均获得了55军功,每次每人获得的军功数不会超过100,不会低于-100。

第二种形如:

QUERY 300 表示南将军在询问第300个人的军功是多少。

输出
对于每次查询输出此人的军功,每个查询的输出占一行。
样例输入
4 10
ADD 1 3 10
QUERY 3
ADD 2 6 50
QUERY 3
样例输出
10
60
来源
//区间更新,查单点
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e6+5;
struct tree{
	int l,r;
	int num;
}t[N*4];
void build(int l,int r,int root){
	t[root].l=l;
	t[root].r=r;
	t[root].num=0;
	if(l==r)
		return;
	int mid=(r+l)/2;
	build(l,mid,2*root);
	build(mid+1,r,2*root+1);
}
void update(int l,int r,int val,int root){
	if(l<=t[root].l&&t[root].r<=r){
		t[root].num+=val;
		return;
	}
	int mid=(t[root].l+t[root].r)/2;
	if(r<=mid)
		update(l,r,val,2*root);
	else if(l>mid)
		update(l,r,val,2*root+1);
	else{
		update(l,mid,val,2*root);
		update(mid+1,r,val,2*root+1);
	}
}
int ans;
void find(int id,int root){
	ans+=t[root].num;
	if(t[root].l==t[root].r){
		//ans=t[root].num;
		return;
	}
	int mid=(t[root].l+t[root].r)/2;
	if(id<=mid)
		find(id,2*root);
	else
		find(id,2*root+1);
}
int main(){
	int t,n;
	int x,y,z;
	char s[10];
	while(~scanf("%d %d",&t,&n)){
		build(1,n,1);
		while(t--){
			scanf("%s",s);
			if(s[0]=='A'){
				scanf("%d %d %d",&x,&y,&z);
				update(x,y,z,1);
			}
			else if(s[0]=='Q'){
				scanf("%d",&x);
				ans=0;
				find(x,1);
				printf("%d\n",ans);
			}
		}
	}

	return 0;
}

时间: 2024-11-05 12:32:05

ny 123 士兵杀敌(四)-- 线段树(区间更新,单点查询)的相关文章

Light OJ 1080 - Binary Simulation - (线段树区间更新 单点查询)

Description Given a binary number, we are about to do some operations on the number. Two types of operations can be here. 'I i j'    which means invert the bit from i to j (inclusive) 'Q i'    answer whether the ith bit is 0 or 1 The MSB (most signif

ZOJ 1610 Count the Colors【题意+线段树区间更新&amp;&amp;单点查询】

任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent

POJ 2777 Count Color (线段树区间更新加查询)

Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem. There is a very long board with length L centimeter, L is a positive integer, so we can evenly d

Wikilo 1191线段树区间修改单点查询

这题也算比较容易的了. 如果哪个区间已经没有黑色的话,就不用update了,就是因为这个原因WA了2发,唉-- #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #incl

HDU 5861 Road(线段树 区间修改 单点查询)

Road Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1132    Accepted Submission(s): 309 Problem Description There are n villages along a high way, and divided the high way into n-1 segments. E

POJ - 2155 Matrix (二维树状数组 + 区间改动 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)

POJ - 2155 Matrix Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we ha

ZOJ 1610 Count the Colors(线段树,区间覆盖,单点查询)

Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent ones. Your task is counting the segments of different colors you can s

POJ 2528 Mayor&#39;s posters (离散化+线段树区间更新)

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for

codevs 1081 线段树练习 2 区间更新 单点查询 无lazy

题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数.如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少. 输出描述 Output Description 对于每个询问输出一行一个答案 样例输

HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是把区间 (l,r) 中大于x的数跟 x 做gcd操作. 线段树区间更新的题目,每个节点保存一个最大和最小值,当该节点的最大值和最小值相等的时候表示这个区间所有的数字都是相同的,可以直接对这个区间进行1或2操作, 进行1操作时,当还没有到达要操作的区间但已经出现了节点的最大值跟最小值相等的情况时,说明