呃照着板子写的怎么就wa了啊
查看原帖
呃照着板子写的怎么就wa了啊
225941
冰冻罗非鱼楼主2022/8/5 09:05
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct query{
	int l,r,id;
}q[MAXN];
int n,a[MAXN],ans[MAXN],__cnt[MAXN],belong[MAXN],b[MAXN],cnt[MAXN],L[MAXN],R[MAXN],mm;
map<int,int> m;
bool cmp(query a,query b){
	return belong[a.l] ^ belong[b.l] ? belong[a.l] < belong[b.l] : (belong[a.l] & 1 ? a.r < b.r : a.r > b.r);
}
int main(){
	cin >> n >> mm;
	int size = sqrt(n);
	int num = ceil((double)n / size);
	for(int i = 1; i <= num; i++){
		for(int j = (i - 1) * size + 1; j <= i * size; j++){
			belong[j] = i;
		}
		L[i] = (i - 1) * size + 1;
		R[i] = min(i * size,n);
	}
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		b[i] = a[i];
	}
	sort(b + 1,b + 1 + n);
	for(int i = 1; i <= n; i++){
		if(m.find(b[i]) == m.end())m[b[i]] = i;
	}
	for(int i = 1; i <= n; i++){
		a[i] = m[a[i]];
	}
	for(int i = 1; i <= mm; i++){
		cin >> q[i].l >> q[i].r;
		q[i].id = i;
	}
	
	sort(q + 1,q + 1 + mm,cmp);
	int l = 1,r = 0,__l,last_block;
	for(int i = 1; i <= mm; i++){
		if(belong[q[i].l] == belong[q[i].r]){
			for(int j = q[i].l; j <= q[i].r; j++){
				__cnt[a[j]]++;
			}
			for(int j = q[i].l; j <= q[i].r; j++){
				ans[q[i].id] = max(ans[q[i].id],b[a[j]] * __cnt[a[j]]);
			}
			for(int j = q[i].l; j <= q[i].r; j++){
				__cnt[a[j]]--;
			}
			continue;
		}
		if(belong[q[i].l] != last_block){
			while(r > R[belong[q[i].l]]){
				cnt[a[r]]--;
				--r;
			}
			while(l < R[belong[q[i].l]] + 1){
				cnt[a[l]]--;
				++l;
			}
			last_block = belong[q[i].l];
		}
		while(r < q[i].r){
			++r;
			cnt[a[r]]++;
			ans[q[i].id] = max(ans[q[i].id],cnt[a[r]] * b[a[r]]);
		}
		__l = l;
		while(__l > q[i].l){
			--__l;
			cnt[a[__l]]++;
			ans[q[i].id] = max(ans[q[i].id],cnt[a[__l]] * b[a[__l]]);
		}
		while(__l < l){
			cnt[a[__l]]--;
			++__l;
		}
	}
	for(int i = 1; i <= mm; i++){
		cout << ans[i] << "\n";
	}
}
2022/8/5 09:05
加载中...