83个点有一个TLE,时限4s,我的代码4414ms。
#include <bits/stdc++.h>
#define ll long long
#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
using namespace std;
inline int read(){
int x = 0, f = 1;char ch = gc();
while (ch < '0' || ch > '9'){if(ch=='-') f = -1;ch = gc();}
while (ch >= '0' && ch <= '9'){x = x * 10 + ch - 48;ch = gc();}
return x * f;
}
inline void write(ll x){
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
const int N = 1e5 + 100;
int n, m;
int B, K;
int bl[N];
struct Qs{
int l, r, id;
friend bool operator < (Qs x, Qs y){return (bl[x.l] != bl[y.l]) ? (x.l < y.l) : (x.r < y.r);}
}qs[N];
int a[N], v[N];
int l[N], r[N];
int cnt[N];
ll res, bkup;
void add(int x){
++cnt[x];
res = max(res, 1LL * cnt[x] * a[x]);
}
ll cf[N];
ll bf(int s, int t){
ll ret = 0;
for(int i = s;i <= t;i++) ++cf[v[i]];
for(int i = 1;i <= n;i++) ret = max(ret, 1LL * cf[v[i]] * a[v[i]]);
for(int i = s;i <= t;i++) --cf[v[i]];
return ret;
}
ll ans[N];
int main(){
n = read(), m = read();
K = sqrt(n);
for(int i = 1;i <= n;i++){a[i] = v[i] = read();}
sort(a + 1, a + 1 + n);
for(int i = 1;i <= n;i++) v[i] = lower_bound(a + 1, a + 1 + n, v[i]) - a;
for(int i = 1;i <= m;i++){qs[i].l = read();qs[i].r = read();qs[i].id = i;}
B = (n + K - 1) / K;
for(int i = 1;i <= B;i++) l[i] = (i - 1) * K + 1, r[i] = i * K;
r[B] = n;
for(int i = 1;i <= n;i++) bl[i] = (i - 1) / K + 1;
sort(qs + 1, qs + 1 + m);
for(int i = 1, idx = 1, L, R;i <= B;i++,bkup = 0){
for(int j = 1;j <= n;j++) cnt[j] = 0;
for(R = r[i];idx <= m && bl[qs[idx].l] == i;++idx){
if(bl[qs[idx].l] == bl[qs[idx].r]) ans[qs[idx].id] = bf(qs[idx].l, qs[idx].r);
else{
L = r[i] + 1;
res = bkup;
while(R < qs[idx].r) add(v[++R]);
bkup = res;
while(L > qs[idx].l) add(v[--L]);
ans[qs[idx].id] = res;
while(L <= r[i]) --cnt[v[L++]];
}
}
}
for(int i = 1;i <= m;i++){write(ans[i]);putchar('\n');}
return 0;
}