据统计,蒟蒻已经 CE 39次了。
Dev C++ 上明明是能编译成功的。
不知为什么,标程有时也会 CE。
但是标程 CE 的概率明显小很多。
有一点怀疑是 RE 了。
求各位大佬麻烦看一看。
蒟蒻的代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[100001],b[100001],g[100001],len=0,m,Ans[100001],belong[100001],size,M;
long long B[100001],be[100001],d[100001];
struct Q {
long long l,r,id;
}q[100001];
bool cmp(Q a,Q b) {
if (belong[a.l]!=belong[b.l]) return belong[a.l]<belong[b.l];
else return a.r<b.r;
}
long long query(long long x,long long y) {
long long ans=0;
for(long long i=x;i<=y;i++) {
B[a[i]]++; ans=max(ans,be[a[i]]*B[a[i]]);
}
for(long long i=x;i<=y;i++) B[a[i]]--;
return ans;
}
long long doit(long long Qnum,long long x) {
for(long long i=1;i<=M;i++) b[i]=0;
long long L=min(x*size,n);
long long i=Qnum,l=L+1,r=L;
long long anss=0;
for(;belong[q[i].l]==x;i++) {
if (belong[q[i].l]==belong[q[i].r]) {
Ans[q[i].id]=query(q[i].l,q[i].r);
continue;
}
while (r<q[i].r) {
++r;
b[a[r]]++;
anss=max(anss,b[a[r]]*be[a[r]]);
}
long long qwq=anss;
while (l>q[i].l) {
--l;
b[a[l]]++;
anss=max(anss,b[a[l]]*be[a[l]]);
g[++len]=a[l];
}
Ans[q[i].id]=anss;
anss=qwq;
for(long long j=1;j<=len;j++) b[g[j]]--;
len=0;
l=L+1;
}
return i;
}
int main() {
scanf("%lld%lld",&n,&m); size=sqrt(n);
for(long long i=1;i<=n;i++) scanf("%lld",a+i),d[i]=a[i],belong[i]=(i-1)/size+1;
sort(d+1,d+n+1);
M=unique(d+1,d+n+1)-d-1;
for(long long i=1;i<=n;i++) {
long long T=lower_bound(d+1,d+M+1,a[i])-d;
be[T]=a[i]; a[i]=T;
}
for(long long i=1;i<=m;i++) {
scanf("%lld%lld",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
long long Qnum=1;
for(long long i=1;i<=belong[n];i++) {
Qnum=doit(Qnum,i);
}
for(long long i=1;i<=m;i++) printf("%lld\n",Ans[i]);
return 0;
}
标程:
#include<stdio.h>
#include<vector>
#include<algorithm>
#define SQ 100
/*
bucket size: 100
*/
using namespace std;
int c[110000];
int d[110000];
int z[110000];
vector<int>v[110000];
long long e[110000];
long long f[3000][3000];
int main(){
int a,b;
scanf("%d%d",&a,&b);
for(int i=0;i<a;i++)scanf("%d",c+i);
for(int i=0;i<a;i++){
z[i]=c[i];
}
std::sort(z,z+a);
for(int i=0;i<a;i++){
d[i]=lower_bound(z,z+a,c[i])-z;
v[d[i]].push_back(i);
}
for(int i=0;i<a/SQ;i++){
for(int j=0;j<a;j++)e[j]=0LL;
long long val=0LL;
for(int j=i*SQ;j<=a;j++){
if(j%SQ==0){
f[i][j/SQ]=val;
}
e[d[j]]+=z[d[j]];
val=max(val,e[d[j]]);
}
}
for(int i=0;i<b;i++){
int p,q;
scanf("%d%d",&p,&q);
p--;
long long ret=f[(p+SQ-1)/SQ][q/SQ];
for(int j=p;j%SQ;j++){
ret=max(ret,(long long)z[d[j]]*(lower_bound(v[d[j]].begin(),v[d[j]].end(),q)-lower_bound(v[d[j]].begin(),v[d[j]].end(),p)));
}
for(int j=q-1;(j+1)%SQ;j--){
ret=max(ret,(long long)z[d[j]]*(lower_bound(v[d[j]].begin(),v[d[j]].end(),q)-lower_bound(v[d[j]].begin(),v[d[j]].end(),p)));
}
printf("%lld\n",ret);
}
}
谢谢。