P1531 I Hate It

自為風月馬前卒發表於2017-07-08

題目背景

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

題目描述

不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績

輸入輸出格式

輸入格式:

 

第一行,有兩個正整數 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'的時候,表示這是一條更新操作,如果當前A學生的成績低於B,則把ID為A的學生的成績更改為B,否則不改動。

 

輸出格式:

 

對於每一次詢問操作,在一行裡面輸出最高成績

 

輸入輸出樣例

輸入樣例#1:
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
輸出樣例#1:
5
6
5
9

線段樹區間查詢+單點修改

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define ls k<<1
 8 #define rs k<<1|1
 9 using namespace std;
10 const int MAXN=2000001;
11 void read(int &n)
12 {
13     char c='+';int x=0;bool flag=0;
14     while(c<'0'||c>'9')
15     {c=getchar();if(c=='-')flag=1;}
16     while(c>='0'&&c<='9')
17     {x=x*10+c-48,c=getchar();}
18     flag==1?n=-x:n=x;
19 }
20 int n,m;
21 int ans=-1;
22 struct node
23 {
24     int l,r,w;
25 }tree[MAXN*4];
26 void update(int k)
27 {
28     tree[k].w=max(tree[ls].w,tree[rs].w);
29 }
30 void build_tree(int ll,int rr,int k)
31 {
32     tree[k].l=ll;tree[k].r=rr;
33     if(ll==rr)
34     {
35         read(tree[k].w);
36         return ;
37     }
38     int mid=(ll+rr)>>1;
39     build_tree(ll,mid,ls);
40     build_tree(mid+1,rr,rs);
41     update(k);
42 }
43 void query(int ll,int rr,int k)
44 {
45     if(ll>tree[k].r||rr<tree[k].l)
46         return ;
47     if(ll<=tree[k].l&&tree[k].r<=rr)
48     {
49         ans=max(ans,tree[k].w);
50         return ;
51     }
52     int mid=(tree[k].l+tree[k].r)>>1;
53     query(ll,rr,ls);
54     query(ll,rr,rs);
55 }
56 void change(int pos,int v,int k)
57 {
58     if(pos>tree[k].r||pos<tree[k].l)
59         return ;
60     if(tree[k].l==tree[k].r)
61     {
62         tree[k].w=v;
63         return ;
64     }
65     change(pos,v,ls);
66     change(pos,v,rs);
67     update(k);
68 }
69 int main()
70 {
71     read(n);read(m);
72     build_tree(1,n,1);
73     for(int i=1;i<=m;i++)
74     {
75         string s;
76         cin>>s;
77         if(s[0]=='Q')// 查詢
78         {
79             int l,r;
80             read(l);read(r);
81             ans=0;
82             query(l,r,1);
83             printf("%d\n",ans);
84         } 
85         else 
86         {
87             int x,y;
88             read(x);read(y);
89             ans=0;
90             query(x,x,1);
91             if(ans<y)
92             change(x,y,1);
93         }
94     }
95     return 0;
96 } 

 

 

相關文章