求助,AC+WA,回滚莫队马蜂良好带注释
查看原帖
求助,AC+WA,回滚莫队马蜂良好带注释
989571
_ayaka_楼主2024/8/22 19:24
#include<bits/stdc++.h>
using namespace std;
struct dr {
	int id, num;
} a[100005];
struct que {
	int l, r, id;
} q[100005];
int n, m, w[100005], d[100005], tot, sq, belong[100005], rig[10005],ans[100005], l, r,bc, k,res,cnt[100005];
bool px(dr x, dr y) {
	return x.num < y.num;
}//离散化用到的排序
bool cmp(que x, que y) {
	if (belong[x.l] != belong[y.l]) return belong[x.l] < belong[y.l];
	return x.r < y.r;
}//处理问题用到的排序
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i].num, a[i].id = i;
	sort(a + 1, a + n + 1, px);
	for (int i = 1; i <= n; i++) {
		if (a[i].num != a[i - 1].num) {
			d[++tot] = a[i].num;
		}
		w[a[i].id] = tot;
	}//前面为离散化部分,w 为离散好的数组,d 为离散的数对应的原数
	sq = sqrt(n);
	for (int i = 1; i <= n; i++) {
		belong[i] = (i - 1) / sq + 1;
		if (belong[i] != belong[i - 1] && belong[i - 1] != 0) rig[belong[i - 1]] = i - 1;
	}
	rig[belong[n]] = n;//分块
	for (int 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; i <= m; i++) {
		if (belong[q[i].l] != k) {
			for(int j=rig[k];j<=r;j++) cnt[w[j]]--;//将前面的保存清零
			k=belong[q[i].l];
			l=rig[k],r=rig[k];
			cnt[w[l]]++;
			res=d[w[l]];//记录此分块右端点的数字
		}//对于目标 l 跳到下一个分块进行处理
		while(r<q[i].r){
			cnt[w[++r]]++;
			res=max(res,d[w[r]]*cnt[w[r]]);
		}//若指针 r 在目标 r 左侧
		bc=res;
		while(r>q[i].r){
			cnt[w[r--]]--;
		}//若指针 r 在目标 r 右侧
		while(l>q[i].l){
			cnt[w[--l]]++;
			bc=max(bc,d[w[l]]*cnt[w[l]]);
		}//跳 l
		for(int j=l;j<rig[k];j++) cnt[w[j]]--;
		l=rig[k];//清空临时处理的 l 和保存的数字
		ans[q[i].id]=bc;//记录答案
	}
	for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";//输出答案
	return 0;
}
2024/8/22 19:24
加载中...