首页 > 其他分享 >P1531 I Hate It

P1531 I Hate It

时间:2023-11-24 16:44:40浏览次数:31  
标签:P1531 int 询问 样例 成绩 Hate ID

单点修改+区间查询

I Hate It

题目背景

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

题目描述

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

输入格式

第一行,有两个正整数 \(n\) 和 \(m\)(\(0<n \le 2\times 10^5,0<m<5000\)),分别代表学生的数目和操作的数目。学生 ID 编号分别从 \(1\) 编到 \(n\)。

第二行包含 \(n\) 个整数,代表这 \(n\) 个学生的初始成绩,其中第 \(i\) 个数代表 ID 为 \(i\) 的学生的成绩。

接下来有 \(m\) 行。每一行有一个字符 \(c\)(只取 QU),和两个正整数 \(a\),\(b\)。

  • 当 \(c\) 为 Q 的时候,表示这是一条询问操作,它询问 ID 从 \(a\) 到 \(b\)(包括 \(a,b\)) 的学生当中,成绩最高的是多少;
  • 当 \(c\) 为 U 的时候,表示这是一条更新操作,如果当前 \(a\) 学生的成绩低于 \(b\),则把 ID 为 \(a\) 的学生的成绩更改为 \(b\),否则不改动。

输出格式

对于每一次询问操作输出一行一个整数,表示最高成绩。

样例 #1

样例输入 #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
```#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int tr[N<<2],tag[N<<2],a[N];
struct segment_tree{
	void push_up(int i){
		tr[i]=max(tr[i<<1],tr[i<<1|1]);
	}
	
	void build(int i,int l,int r){
		if(l==r){
			tr[i]=a[l];
			return;
		}
		int mid=(l+r)>>1;
		build(i<<1,l,mid);
		build(i<<1|1,mid+1,r);
		push_up(i);
	}
	
	void f(int i,int k){
		tag[i]+=k;
		tr[i]=max(tr[i],k);
	}
	
	void push_down(int i,int l,int r){
		if(tag[i]){
			int mid=(l+r)>>1;
			f(i<<1,tag[i]);
			f(i<<1|1,tag[i]);
			tag[i]=0;
		}
	}
	
	void update(int i,int L,int R,int t,int x){
		if(L==R){
			if(tr[i]<x)tr[i]=x;
			return;
		}
		push_down(i,L,R);
		int mid=(L+R)>>1;
		if(t<=mid)update(i<<1,L,mid,t,x);
		else update(i<<1|1,mid+1,R,t,x);
		push_up(i);
	}
	
	int query(int i,int L,int R,int l,int r){
		if(l<=L&&r>=R){
			return tr[i];
		}
		push_down(i,L,R);
		int ans=0;
		int mid=(L+R)>>1;
		if(l<=mid){
			int t=query(i<<1,L,mid,l,r);
			ans=max(ans,t);
		}
		if(r>mid){
			int t=query(i<<1|1,mid+1,R,l,r);
			ans=max(ans,t);
		}
		return ans;
	}
}ST;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	ST.build(1,1,n);
	for(int i=1;i<=m;i++){
		char c;
		cin>>c;
		int x,y;
		cin>>x>>y;
		if(c=='Q'){
			int ans=ST.query(1,1,n,x,y);
			cout<<ans<<"\n";
		}else{
			ST.update(1,1,n,x,y);
		}
	}
	return 0;
} 

标签:P1531,int,询问,样例,成绩,Hate,ID
From: https://www.cnblogs.com/yufan1102/p/17854088.html

相关文章

  • CF1523D Love-Hate 题解
    抽象化题意:一共有\(m\)个元素,给定\(n\)个集合,每个集合的元素不超过\(15\)个,求出一个元素个数最多的集合\(S\)是至少\(\lceil\dfrac{n}{2}\rceil\)个集合的子集。其中$p$$(1\len\le2\cdot10^5,1\lep\lem\le60)$我们先假设\(limit=\lceil\dfrac......
  • 详述:whatever的用法
    whatever的用法具体表现如下:  1,whatever可以引导名词性从句,作为主语、宾语或表语,意思是“任何……都”、“无论什么……都”。例如:  Whateveryousayistrue.无论你说什么都是真的。Iwilldowhateveryouwant.我会做任何你想要的事。Heiswhatever......
  • ChatEmail-和邮件对话
    前言ChatEmail基于......
  • P1531 I Hate It —— 个人思路讲解
    原题链接戳这里初版代码一开始码的是普通暴力因为维护区间内的最大值实在没想到什么好的方法点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineN200005#defineilinline#defineInf0x3f3f3f3fintn,m;inta[N];ilintread(){ intx=0; boo......
  • AtCoder Beginner Contest 177 F I hate Shortest Path Problem
    洛谷传送门AtCoder传送门设\(f_{i,j}\)为从第\(1\)行到\((i+1,j)\)的最短路。因为我们并不关心最后到达的是哪一个格子,于是强制\(f_{i,j}\)为必须从\((i,j)\)往下走一格到\((i+1,j)\)的最短路。有转移:\[f_{i,r+1}\getsf_{i-1,j}+r+2-j,j\in[l......
  • chater 8
    商品零售购物篮分析#%%查看数据特征importnumpyasnpimportpandasaspdinputfile=r"D:\py_project\a_三下\GoodsOrder.csv"#输入的数据文件data=pd.......
  • Hate That You Know Me (15黑龙江省赛) (数学公式题)(数论分块) (前缀和,小的数学结论
      思路;遇到数学公式,一层一层剥开发现那个式子就是求n内的每一个数的倍数在n以内的数量,明显数论分块来处理这个问题然后就是因子的^2,^3,这个子问题......
  • P4852 yyf hates choukapai
    yyf要抽卡第i张卡的欧气值为a[i],而在连抽时,欧气值等于第一张卡的欧气值。每次抽卡的欧气之和”指每次单抽的欧气之和加上每次连抽的欧气之和. yyf想C连抽(连续抽......
  • ChatExcel--自动处理表格
    目录一、简介1.项目背景2.有点超越ChatGPT?3.功能特点4.ChatExcel入口5.操作系数二、页面分析三、浅入测试1.模拟表格内容2.上传文件3.测试降序4.条件筛选四、输入案例五、......
  • [ABC262D] I Hate Non-integer Number 题解
    [ABC262D]IHateNon-integerNumberSolution目录[ABC262D]IHateNon-integerNumberSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入......