社区讨论
求助!分块做法
P1531I Hate It参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @loc01g2k
- 此快照首次捕获于
- 2023/10/30 05:44 2 年前
- 此快照最后确认于
- 2024/08/27 20:49 2 年前
C
#include<bits/stdc++.h>
using namespace std;
const double pi=3.14;
const int inf=0x3f3f3f3f;
const int NIL=-1;
int maxx[5001],l[5001],r[5001],pos[200010];
int a[200010];
int n,q;
void build(){
int dis=sqrt(n);
int num=ceil(n*1.0/dis);
for (int i=1;i<=num;i++){
l[i]=(i-1)*dis+1;
r[i]=i*dis;
}
r[num]=n;
for (int i=1;i<=n;i++){
pos[i]=((i-1)/dis)+1;
}
}
void Update(int x,int y){
if (a[x]<y){
a[x]=y;
maxx[pos[x]]=max(maxx[pos[x]],a[x]);
}
}
int Query(int ll,int rr){
int res=0;
for (int i=ll;i<=r[pos[ll]];i++){
res=max(res,a[i]);
}
for (int i=l[pos[rr]];i<=rr;i++){
res=max(res,a[i]);
}
for (int i=pos[ll]+1;i<=pos[rr]-1;i++){
res=max(maxx[i],res);
}
return res;
}
int read()
{
int ans=0,flag=1;
char ch=getchar();
while( (ch>'9' || ch<'0') && ch!='-' ) ch=getchar();
if(ch=='-') flag=-1,ch=getchar();
while(ch>='0' && ch<='9') ans=ans*10+ch-'0',ch=getchar();
return ans*flag;
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>q;
for (int i=1;i<=n;i++)
cin>>a[i];
build();
int j=1;
for (int i=1;i<=n;i++){
if (i>r[j]) j++;
maxx[j]=max(maxx[j],a[i]);
}
for (int i=1;i<=q;i++){
char opt;
cin>>opt;
int x=read(),y=read();
if (opt=='Q'){
cout<<Query(x,y)<<endl;
}else{
Update(x,y);
}
}
}
不知为何,现在一直是20pts
回复
共 3 条回复,欢迎继续交流。
正在加载回复...