前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P1531 I Hate It

P1531 I Hate It

作者头像
attack
发布2018-04-12 14:21:47
7110
发布2018-04-12 14:21:47
举报

题目背景

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。

题目描述

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩

输入输出格式

输入格式:

第一行,有两个正整数 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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
5
6
5
9

线段树区间查询+单点修改
代码语言:javascript
复制
 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 } 
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目背景
  • 题目描述
  • 输入输出格式
  • 输入输出样例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档