社区讨论
这道题出问题了,原oj ac的解法这里会unknown error
AT_joisc2014_c歴史の研究参与者 5已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @lo1te7v7
- 此快照首次捕获于
- 2023/10/23 02:41 2 年前
- 此快照最后确认于
- 2023/11/24 16:50 2 年前
另附代码,正宗的回滚莫队
CPP#include<bits/stdc++.h>
using namespace std;
#define ll int
#define ri register int
const int N=1e5+5;
ll n,m,sz,bl[N],a[N],b[N],clear[N],lsh[N],b2[N];
long long ans[N];
struct que{
ll l,r,id;
}q[N];
bool cmp(que &x,que &y){
if(bl[x.l]==bl[y.l]) return x.r<y.r;
return bl[x.l]<bl[y.l];
}
long long cal(ll l,ll r){
ll b1[N];
long long ans2=0;
for(ri i=l;i<=r;i++){
b1[a[i]]=0;
}
for(ri i=l;i<=r;i++){
b1[a[i]]++;
ans2=max(ans2,(long long)b1[a[i]]*lsh[a[i]]);
}
return ans2;
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n>>m;sz=sqrt(n);
for(ri i=1;i<=n;i++){
cin>>a[i];lsh[i]=a[i];
bl[i]=(i-1)/sz+1;
}
sort(lsh+1,lsh+n+1);
ll len=unique(lsh+1,lsh+n+1)-(lsh+1);
for(ri i=1;i<=n;i++){
a[i]=lower_bound(lsh+1,lsh+len+1,a[i])-lsh;
}
for(ri i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1,j=1;j<=bl[n];j++){//第j块,第I询问
ll R=min(n,j*sz),l=R+1,r=l-1,cn=0;
long long tmp1=0;
for(;bl[q[i].l]==j;i++){
if(bl[q[i].r]==bl[q[i].l]){
ans[q[i].id]=cal(q[i].l,q[i].r);
continue;
}
while(r<q[i].r){
r++;
b[a[r]]++;
tmp1=max(tmp1,(long long)b[a[r]]*lsh[a[r]]);
clear[++cn]=a[r];
}
long long tmp2=tmp1;
while(l>q[i].l){
l--;
b2[a[l]]++;
tmp1=max(tmp1,(long long)(b[a[l]]+b2[a[l]])*lsh[a[l]]);
}
ans[q[i].id]=tmp1;
tmp1=tmp2;
while(l<R+1){
b2[a[l]]=0;
l++;
}
}
for(ri i=1;i<=cn;i++){
b[clear[i]]=0;
}
}
for(ri i=1;i<=m;i++) cout<<ans[i]<<endl;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...