社区讨论
分块14ptsqt
P2880[USACO07JAN] Balanced Lineup G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mkdymn7d
- 此快照首次捕获于
- 2026/01/14 19:51 上个月
- 此快照最后确认于
- 2026/01/17 21:00 上个月
CPP
#include<bits/stdc++.h>
using namespace std;
int a[50009];
int mx[50009],mn[50009],block_size;
int get(int i)
{
return (i-1)/block_size+1;
}
int main()
{
int n,q;
cin>>n>>q;
block_size=sqrt(n);
memset(mn,0x7f,sizeof mn);
for(int i=1;i<=n;i++)
{
cin>>a[i];
int p=get(i);
mx[p]=max(mx[p],a[i]);
mn[p]=min(mn[p],a[i]);
}
for(int i=1;i<=q;i++)
{
int l,r;
cin>>l>>r;
int start=get(l),end=get(r); //块编号
int Mx=0,Mn=INT_MAX;
int ed1,ed2;
if(start<end)
{
ed1=min(start*block_size,r); //下标 第一个不完整块结尾
for(int j=l;j<=ed1;j++)Mx=max(Mx,a[j]);
for(int j=start;j<=end;j++)Mx=max(Mx,mx[j]);
ed2=max(l+1,(end-1)*block_size+1); //第二个不完整块开始
for(int j=ed2;j<=r;j++)Mx=max(Mx,a[j]);
}
else{for(int j=l;j<=r;j++)Mx=max(Mx,a[j]);}
//cout<<ed1<<" | "<<ed2<<endl;
if(start<end)
{
ed1=min(start*block_size,r); //下标 第一个不完整块结尾
for(int j=l;j<=ed1;j++)Mn=min(Mn,a[j]);
for(int j=start;j<=end;j++)Mn=min(Mn,mn[j]);
ed2=max(l+1,(end-1)*block_size+1); //第二个不完整块开始
for(int j=ed2;j<=r;j++)Mn=min(Mn,a[j]);
}
else{for(int j=l;j<=r;j++)Mn=min(Mn,a[j]);}
cout<<Mx-Mn<<endl;
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...