程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDOJ 題目1754 I Hate It(線段樹單點更新,求區間最大值)

HDOJ 題目1754 I Hate It(線段樹單點更新,求區間最大值)

編輯:C++入門知識

HDOJ 題目1754 I Hate It(線段樹單點更新,求區間最大值)


I Hate It

Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 44713 Accepted Submission(s): 17548



Problem Description 很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。
這讓很多學生很反感。

不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。
Input 本題目包含多組測試,請處理到文件結束。
在每個測試的第一行,有兩個正整數 N 和 M ( 0 學生ID編號分別從1編到N。
第二行包含N個整數,代表這N個學生的初始成績,其中第i個數代表ID為i的學生的成績。
接下來有M行。每一行有一個字符 C (只取'Q'或'U') ,和兩個正整數A,B。
當C為'Q'的時候,表示這是一條詢問操作,它詢問ID從A到B(包括A,B)的學生當中,成績最高的是多少。
當C為'U'的時候,表示這是一條更新操作,要求把ID為A的學生的成績更改為B。

Output 對於每一次詢問操作,在一行裡面輸出最高成績。
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output
5
6
5
9

HintHuge input,the C function scanf() will work better than cin 

Author linle
Source 2007省賽集訓隊練習賽(6)_linle專場
Recommend lcy | We have carefully selected several similar problems for you: 1698 1542 2795 1540 1255 為毛函數調用比宏定義還快,寫成宏定義就超時,寫成函數就過了 ac代碼
#include
#include
//#define max(a,b) (a>b?a:b)
int node[200020<<2];
int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
void pushup(int tr)
{
	node[tr]=max(node[tr<<1],node[tr<<1|1]);
}
void build_tr(int l,int r,int tr)
{
	if(l==r)
	{
		scanf("%d",&node[tr]);
		return;
	}
	int mid=(l+r)>>1;
	build_tr(l,mid,tr<<1);
	build_tr(mid+1,r,tr<<1|1);
	pushup(tr);
}
void update(int num,int add,int l,int r,int tr)
{
	if(l==r)
	{
		node[tr]=add;
		return;
	}
	int mid=(l+r)>>1;
	if(num>mid)
		update(num,add,mid+1,r,tr<<1|1);
	else
		update(num,add,l,mid,tr<<1);
	pushup(tr);
}
int query(int x,int y,int l,int r,int tr)
{
	int ans=0;
	if(x<=l&&y>=r)
		return node[tr];
	int mid=(l+r)>>1;
	if(x<=mid)
		ans=max(ans,query(x,y,l,mid,tr<<1));
	if(y>mid)
		ans=max(ans,query(x,y,mid+1,r,tr<<1|1));
	return ans;
}
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		build_tr(1,n,1);
		char s[2];
		int a,b;
		while(m--)
		{
			scanf("%s%d%d",s,&a,&b);
			if(s[0]=='U')
			{
				update(a,b,1,n,1);
			}
			else
				printf("%d\n",query(a,b,1,n,1));
		}
	}
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved