码迷,mamicode.com
首页 > 其他好文 > 详细

UVa Online Judge 12532 - Interval Product

时间:2015-08-13 01:15:02      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:线段树

http://acm.bnu.edu.cn/v3/problem_show.php?pid=27853

Interval Product

Time Limit: 2000ms
Memory Limit: 131072KB
This problem will be judged on UVA. Original ID: 12532
64-bit integer IO format: %lld Java class name: Main
Type:
None
 

[PDF Link]

It‘s normal to feel worried and tense the day before a programming contest. To relax, you went out for a drink with some friends in a nearby pub. To keep your mind sharp for the next day, you decided to play the following game. To start, your friends will give you a sequence of N integers X1, X2,..., XN. Then, there will be K rounds; at each round, your friends will issue a command, which can be:

Since you are at a pub, it was decided that the penalty for a wrong answer is to drink a pint of beer. You are worried this could affect you negatively at the next day‘s contest, and you don‘t want to check if Ballmer‘s peak theory is correct. Fortunately, your friends gave you the right to use your notebook. Since you trust more your coding skills than your math, you decided to write a program to help you in the game.

 

Input

Each test case is described using several lines. The first line contains two integers N and K, indicating respectively the number of elements in the sequence and the number of rounds of the game ( 1技术分享N, K技术分享105). The second line contains N integers Xi that represent the initial values of the sequence ( -100技术分享Xi技术分享100 for i = 1, 2,..., N). Each of the next K lines describes a command and starts with an uppercase letter that is either `C‘ or `P‘. If the letter is `C‘, the line describes a change command, and the letter is followed by two integers I and V indicating that XI must receive the value V ( 1技术分享I技术分享N and -100技术分享V技术分享100). If the letter is `P‘, the line describes a product command, and the letter is followed by two integers I and J indicating that the product from XI to XJ, inclusive must be calculated ( 1技术分享I技术分享J技术分享N). Within each test case there is at least one product command.

 

Output

For each test case output a line with a string representing the result of all the product commands in the test case. The i-th character of the string represents the result of the i-th product command. If the result of the command is positive the character must be `+‘ (plus); if the result is negative the character must be `-‘ (minus); if the result is zero the character must be `0‘ (zero).

 

Sample Input

 

4 6
-2 6 0 -1
C 1 10
P 1 4
C 3 7
P 2 2
C 4 -5
P 1 4
5 9
1 5 -2 4 3
P 1 2
P 1 5
C 4 -5
P 1 5
P 4 5
C 3 0
P 1 5
C 4 -5
C 4 -5

 

Sample Output

 

0+-
+-+-0


题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3977

题目大意:C时更新下标I处的值为V,P时计算下标I到J的数的乘积,若乘积为正输出+,乘积为负输出-,乘积为0输出0。

解题思路:裸线段树,T了很多次,注意更新和读取值函数的返回条件。

代码如下:

#include <cstdio>
#include <cstring>
const int maxn=100005;
int a[maxn],tr[4*maxn];
void build(int l,int r,int root)
{
	if(l==r)
	{
		scanf("%d",&a[l]);
		if(a[l]==0)
			tr[root]=0;
		else if(a[l]<0)
			tr[root]=-1;
		else
			tr[root]=1;
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,root*2);
	build(mid+1,r,root*2+1);
	tr[root]=tr[root*2]*tr[root*2+1];
}
void change(int l,int r,int x,int v,int root)
{
	if(l==r)
	{
		if(l==x)
		{
			a[l]=v;
			if(a[l]==0)
				tr[root]=0;
			else if(a[l]<0)
				tr[root]=-1;
			else
				tr[root]=1;
		}
		return ;
	}
	int mid=(l+r)/2;
	if(x<=mid)
	change(l,mid,x,v,root*2);
	else
	change(mid+1,r,x,v,root*2+1);
	tr[root]=tr[root*2]*tr[root*2+1];
}
int product(int l,int r,int x,int y,int root)
{
	if(l>=x&&r<=y)
		return tr[root];
	int mid=(l+r)/2,tm=1;
	if(x<=mid)
		tm*=product(l,mid,x,y,root*2);
	if(y>mid)
		tm*=product(mid+1,r,x,y,root*2+1);
	return tm;
}
int main()
{
	int n,k,x,y;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
		char c;
		int m=0;
		memset(a,0,sizeof(a));
		build(1,n,1);
		for(int i=0;i<k;i++)
		{
			getchar();
			scanf("%c%d%d",&c,&x,&y);
			if(c=='C')
			{
				if(a[x]==0&&y==0||a[x]<0&&y<0||a[x]>0&&y>0)
					continue;
				a[x]=y;
				change(1,n,x,y,1);
			}
			else
			{
				int tm=product(1,n,x,y,1);
				if(tm<0)
					printf("-");
				else if(tm==0)
					printf("0");
				else
					printf("+");
			}
		}
		printf("\n");
	}
	return 0;
}


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

UVa Online Judge 12532 - Interval Product

标签:线段树

原文地址:http://blog.csdn.net/criminalcode/article/details/47460727

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!