萌新求助回滚莫队
查看原帖
萌新求助回滚莫队
150467
never_turn_right楼主2022/2/10 21:25

第一个点就错了。。。

#include<bits/stdc++.h>
using namespace std;
#define N 100005
long long n,m;
long long x[N];
long long xfx[N];
struct ASK
{
  long long l,r,id;
}ask[N];
long long ans[N];
long long a[N];
long long tong[N];
long long kc;
bool cmp(ASK a,ASK b)
{
  if(a.l/kc!=b.l/kc)
    return a.l/kc<b.l/kc;
  return a.r<b.r;
}
long long blk[N],blkcnt=0;
queue<pair<long long,long long> > qu;
int main()
{
  freopen("my.in","r",stdin);
  freopen("my.out","w",stdout);
  scanf("%lld%lld",&n,&m);
  kc=sqrt(n);
  for(long long i=1;i<=n;i++)
    scanf("%d",&x[i]),xfx[i]=x[i];
  for(long long i=1;i<=m;i++)
  {
    scanf("%lld%lld",&ask[i].l,&ask[i].r);
    ask[i].id=i;
  }
  sort(ask+1,ask+1+m,cmp);
  sort(xfx+1,xfx+1+n);
  long long tmpp=unique(xfx+1,xfx+1+n)-xfx;
  for(long long i=1;i<=n;i++)
    a[i]=lower_bound(xfx+1,xfx+1+tmpp,x[i])-xfx;
  blk[++blkcnt]=1; 
  for(long long i=2;i<=m;i++)
    if(ask[i-1].l/kc!=ask[i].l/kc)
      blk[++blkcnt]=i;
  blk[blkcnt+1]=m+1;
  for(long long i=1;i<=blkcnt;i++)
  {
    long long nowans=0;
    memset(tong,0,sizeof(tong));
    long long nl,nr;
    nl=floor(1.0*ask[blk[i]].l/kc)*kc+kc-1;
    nr=nl-1;
    for(long long j=blk[i];j<blk[i+1];j++)
    {
      if(ask[j].r/kc==ask[j].l/kc)
      {
        nowans=0;
        for(long long kk=ask[j].l;kk<=ask[j].r;kk++)
        {
          tong[a[kk]]++;
          nowans=max(nowans,tong[a[kk]]*x[kk]);
        }
        ans[ask[j].id]=nowans;
        for(long long kk=ask[j].l;kk<=ask[j].r;kk++)
          tong[a[kk]]--;
      }
      else
      {
        int tmpnl=nl;
        while(nr<ask[j].r)
        {
          nr++;
          tong[a[nr]]++;
          nowans=max(nowans,tong[a[nr]]*x[nr]);
        }
        long long tmpans=nowans;
        while(nl>ask[j].l)
        {
          nl--;
          tong[a[nl]]++;
          tmpans=max(tmpans,tong[a[nl]]*x[nl]);
          qu.push(make_pair(a[nl],tong[a[nl]]-1));
        }
        ans[ask[j].id]=tmpans;
        while(qu.size())
        {
          auto aa=qu.front();
          qu.pop();
          tong[aa.first]=aa.second;
        }
        nl=tmpnl;
      }
    }  
  }
  for(long long i=1;i<=m;i++)
    printf("%lld\n",ans[i]);
  return 0;
} 
2022/2/10 21:25
加载中...