列表

详情


NC213938. 仓鼠与珂朵莉

描述

输入描述

输入描述见上

输出描述

输出描述见上

示例1

输入:

5 5
9 8 7 8 9
0 1
10 11
9 9
11 9
16 19

输出:

9
8
8
16
16

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 869ms, 内存消耗: 29672K, 提交时间: 2021-08-13 15:05:58

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int maxn=7e5+100;
typedef long long ll;
const int N=5e3+100;
ll f[N][N];
int n,m;
ll a[maxn],val[maxn];
int belong[maxn];
int block=101;
map<ll,ll>mp;
vector<ll>v[maxn];
int idx=0;
void init(int x){
	vector<ll>cnt(n);
	ll mx=0;
	for(int i=(x-1)*block+1;i<=n;i++){
		cnt[a[i]]++;
		if(1ll*cnt[a[i]]*val[a[i]]>mx){
			mx=1ll*cnt[a[i]]*val[a[i]];
		}
		f[x][belong[i]]=mx;
	}
}
ll query(int l,int r,int x){
	return upper_bound(v[x].begin(), v[x].end(), r) - lower_bound(v[x].begin(), v[x].end(), l);
}
ll query(int l,int r){
	ll mx=f[belong[l]+1][belong[r]-1];
	for(int i=l;i<=min(belong[l]*block,r);i++){
		ll t=query(l,r,a[i]);
		if(1ll*t*val[a[i]]>mx){
			mx=1ll*t*val[a[i]];
		}
	}
	if(belong[l]!=belong[r]){
		for(int i=(belong[r]-1)*block+1;i<=r;i++){
			ll t=query(l,r,a[i]);
			if(1ll*t*val[a[i]]>mx){
				mx=t*val[a[i]];
			}
		}
	}
	return mx;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		if(mp.find(a[i])==mp.end()){
			mp[a[i]]=++idx;	
			val[idx] = a[i];
		}
		a[i]=mp[a[i]];
		v[a[i]].push_back(i);
	}	
	for(int i=1;i<=n;i++){
		belong[i]=(i-1)/block+1;
	}
	for(int i=1;i<=belong[n];i++){
		init(i);
	}
	ll l,r;
	ll ans=0;
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&l,&r);
		l=(ans^l)%n+1;
		r=(ans^r)%n+1;
		if(l>r) swap(l,r);	
		ans=query(l,r);
		cout<<ans<<"\n"; 
	}
}

上一题