国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

hdu 1754 I Hate It 線段樹單點更新區間查詢

2019-11-11 02:59:09
字體:
來源:轉載
供稿:網友

題目:

I Hate It

Time Limit: 9000/3000 MS (java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 69414    Accepted Submission(s): 26895PRoblem Description很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。 Input本題目包含多組測試,請處理到文件結束。在每個測試的第一行,有兩個正整數 N 和 M ( 0<N<=200000,0<M<5000 ),分別代表學生的數目和操作的數目。學生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 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5 Sample Output
5659HintHuge input,the C function scanf() will work better than cin

分析:

rmq問題。由于數組動態變化,不能用st表。

代碼:

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<ctype.h>    //tower()#include<set>  #include<map>  #include<iomanip>// cout<<setprecision(1)<<fixed<<a;#include<vector>   #include<time.h>  #include<assert.h>  //assert#include<cmath>	#include<algorithm>#include<bitset>#include<limits.h>#include<stack>#include<queue>using namespace std;const int maxn=200010;const int inf=0x7fffffff;/*線段樹單點更新*/#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1int n,m,stree[maxn<<2];//根節點維護區間最大值void build(int l,int r,int rt){//葉節點從l到r,樹根為rt	if(l==r){		scanf("%d",&stree[rt]);///stree[rt]=a[l];		return;	}	int mid=(l+r)>>1;	build(lson);//自左向右讀入a[]中數據 	build(rson);	stree[rt]=max(stree[rt<<1],stree[rt<<1|1]); }void update(int x,int v,int l,int r,int rt){//線段樹(樹根為rt,對應區間為[l,r])中x結點更新為v 	if(l==r){		stree[rt]=v;		return;	}	int mid=(l+r)>>1;	if(x<=mid) update(x,v,lson);	if(x>mid) update(x,v,rson);	stree[rt]=max(stree[rt<<1],stree[rt<<1|1]);}int query(int a,int b,int l,int r,int rt){//查詢線段樹(樹根為rt,對應區間為[l,r])中子區間[a,b]的最大值 	if(a<=l&&b>=r) return stree[rt];	int ans=-inf;	int mid=(l+r)>>1;	if(a<=mid) ans=max(query(a,b,lson),ans);	if(b>mid) ans=max(query(a,b,rson),ans);	return ans;}int main(){//1560MS	4696K	while(scanf("%d%d",&n,&m)==2){		memset(stree,0,sizeof(stree));		build(1,n,1);		char s[5];		int p,q;		while(m--){			scanf("%s%d%d",s,&p,&q);			if(s[0]=='U') update(p,q,1,n,1);			else printf("%d/n",query(p,q,1,n,1));		}	}	return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 水城县| 禹州市| 西安市| 寿宁县| 徐州市| 牟定县| 彭州市| 潢川县| 宜川县| 同心县| 榆林市| 许昌县| 大同县| 南靖县| 襄垣县| 利辛县| 饶阳县| 潍坊市| 河西区| 监利县| 沭阳县| 德江县| 柳江县| 新晃| 车险| 江城| 三台县| 黑龙江省| 漠河县| 清水县| 旺苍县| 海晏县| 永和县| 呼和浩特市| 青州市| 广平县| 安徽省| 长治县| 扎赉特旗| 西平县| 航空|