【第22期】观点:IT 行业加班,到底有没有价值?

HDU1698 线段树

原创 2016年06月02日 00:33:26

Just a Hook

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26319    Accepted Submission(s): 13163


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 the hook.

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 or golden sticks.
The total value of the hook is calculated as the sum of values of N metallic sticks. More precisely, the value for each kind of stick is calculated as follows:

For each cupreous stick, the value is 1.
For each silver stick, the value is 2.
For each golden stick, the value is 3.

Pudge wants to know the total value of the hook after performing the operations.
You may consider the original hook is made up of cupreous sticks.
 

Input
The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 10 cases.
For each case, the first line contains an integer N, 1<=N<=100,000, which is the number of the sticks of Pudge’s meat hook and the second line contains an integer Q, 0<=Q<=100,000, which is the number of the operations.
Next Q lines, each line contains three integers X, Y, 1<=X<=Y<=N, Z, 1<=Z<=3, which defines an operation: change the sticks numbered from X to Y into the metal kind Z, where Z=1 represents the cupreous kind, Z=2 represents the silver kind and Z=3 represents the golden kind.
 

Output
For each case, print a number in a line representing the total value of the hook after the operations. Use the format in the example.
 

Sample Input
1 10 2 1 5 2 5 9 3
 

Sample Output
Case 1: The total value of the hook is 24.
 

区间求和的问题,很显然用线段树。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;

int n, sum;

struct node
{
	int l, r, n;
} a[maxn << 2];

void init(int l, int r, int i)
{
	a[i].l = l;
	a[i].r = r;
	a[i].n = 1;
	if (l != r)
	{
		int mid = (l + r) >> 1;
		init(l, mid, 2 * i);
		init(mid + 1, r, 2 * i + 1);
	}
}

void insert(int i, int x, int y, int m)
{
	if (a[i].n == m)//相同则不用修改了
		return;
	if (a[i].l == x && a[i].r == y)//找到了区间,直接更新
	{
		a[i].n = m;
		return;
	}
	if (a[i].n != -1)//如果该区间只有一种颜色
	{
		a[2 * i].n = a[2 * i + 1].n = a[i].n;//由于后面必定对子树操作,所以更新子树的值等于父亲的值
		a[i].n = -1;//由于该区域颜色与修改不同,而且不是给定区域,所以该区域必定为杂色
	}
	//父区间为杂色时对所有子节点进行操作
	int mid = (a[i].l + a[i].r) >> 1;
	if (x>mid)
		insert(2 * i + 1, x, y, m);
	else if (y <= mid)
		insert(2 * i, x, y, m);
	else
	{
		insert(2 * i, x, mid, m);
		insert(2 * i + 1, mid + 1, y, m);
	}
}

int find(int i)//区间求和
{
	if (a[i].n != -1)//纯色直接算这个区间
		return (a[i].r - a[i].l + 1)*a[i].n;
	else//不存则左右子树去找
		return find(i * 2) + find(i * 2 + 1);
}

int main()
{
	int t, i, k, x, y, m;
	int cas = 1;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%d", &n, &k);
		init(1, n, 1);
		while (k--)
		{
			scanf("%d%d%d", &x, &y, &m);
			insert(1, x, y, m);
		}
		printf("Case %d: The total value of the hook is %d.\n", cas++, find(1));
	}

	return 0;
}


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

相关文章推荐

hdu1698 Just a Hook(线段树)

Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T...
  • d_x_d
  • d_x_d
  • 2015-12-17 20:48
  • 2115

HDU1698

线段树水题
  • dizzz
  • dizzz
  • 2016-10-19 16:21
  • 96

hdu1698

/* 分析:     线段树水题,成段更新+成段查询(总共只查询一次)。     线段树学的太菜了,被这水题虐了,弄了一上午- -I                            ...

hdu1698线段树(区间更新)

题目链接just a hook 一个锁链,其组成成部分有三种材料,金银铜,分数为3、2、1,每次可以更换一段的材料,求最后的分数 钩子最多长100,000,操作最多有100,000次,肯定...

hdu1698

线段树 题意:给定一个长度n,初始认为n的单位长度价值为1,以后给定q条命令,每条命令在a和b之间价值变为c,1 线段树区间更新,和单点更新相比,多了一个pushdown函数,即从指定节点向下更新...

hdu1698Just a Hook

http://acm.hdu.edu.cn/showproblem.php?pid=1698 裸的线段树区间更新#include #include #include #include usin...

HDU1698 Just a Hook

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意:给出一段1~n的区间,区间内所有数初始为1,现在可以修改区间内任意一段,问m次修...

HDU1698

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 题目的题意就是:给你一些牌子(铜,银,金)分别用1,2,3表示,一开始这些都是铜牌。现在对...

HDU1698

题目链接: 区间替换,区间求和,模板题。 #include using namespace std; typedef long long ll; ll sum[200020]; ll delta[...

HDU1698 - Just a Hook (线段树 区间更新)

HDU1698 - Just a Hook (线段树 区间更新)题目链接思路线段树的应用,区间更新(不用更新到底,更新到终止节点就行,查询时再将所涉及的节点信息push_down下来),颜色的数量用一...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)