社区讨论

这道题出问题了,原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 条回复,欢迎继续交流。

正在加载回复...