首页 > 代码库 > HDU 1754 I Hate It (线段树)
HDU 1754 I Hate It (线段树)
简单的线段树,多余的就不解释了。
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 #define INF 0xffffff0 6 #define max(a,b) (a>b?a:b) 7 #define min(a,b) (a<b?a:b) 8 struct Node 9 {10 int maxV;11 int L, R;12 int Mid()13 {14 return (L+R)/2;15 }16 }Tree[800010];17 int maxV = 0;18 void BuildTree(int root,int L,int R);19 void Query(int root,int s,int e);20 void Insert(int root,int i,int v);//第i个数 为 V21 22 int main()23 {24 int N, M;25 while(scanf("%d%d",&N,&M) != EOF)26 {27 int k;28 BuildTree(0,1,N);29 for(int i = 1; i <= N; i++)30 {31 scanf("%d",&k);32 Insert(0,i,k);33 }34 while(M--)35 {36 int s, e;37 char str[2];38 maxV = 0;39 scanf("%s%d%d",str,&s,&e);40 if(str[0] == ‘Q‘)41 {42 Query(0,s,e);43 printf("%d\n",maxV);44 }45 else46 Insert(0,s,e);47 }48 }49 return 0;50 }51 52 void BuildTree(int root,int L,int R)53 {54 Tree[root].L = L;55 Tree[root].R = R;56 Tree[root].maxV = 0;57 if(L != R)58 {59 BuildTree(root*2+1,L,Tree[root].Mid());60 BuildTree(root*2+2,Tree[root].Mid()+1,R);61 }62 }63 void Query(int root,int s,int e)64 {65 if(Tree[root].maxV <= maxV)66 return ;67 if(Tree[root].L == s && Tree[root].R == e)68 {69 maxV = max(Tree[root].maxV, maxV);70 return ;71 }72 if(e <= Tree[root].Mid())73 Query(root*2+1,s, e);74 else if( s > Tree[root].Mid())75 Query(root*2+2,s, e);76 else77 {78 Query(root*2+1,s,Tree[root].Mid());79 Query(root*2+2,Tree[root].Mid()+1,e);80 }81 }82 void Insert(int root,int i,int v)//第i个数 为 V83 {84 if(Tree[root].L == Tree[root].R)85 {86 Tree[root].maxV = v;87 return ;88 }89 Tree[root].maxV = max(v,Tree[root].maxV);90 if(i <= Tree[root].Mid())91 Insert(root*2+1,i,v);92 else93 Insert(root*2+2,i,v);94 }
HDU 1754 I Hate It (线段树)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。