求助,/qq
查看原帖
求助,/qq
62573
zzqDeco楼主2020/6/19 21:30

不知道哪里锅了,后面三个点过不去。。。

逐行对比题解也不知道错在哪,orz,求救

#include <cstdio>
#include <algorithm>

using namespace std;

const int size=600;

struct Q
{
  int l,r,a,b,kuai,id;
  int ansa,ansb;
}q[100010];

struct K
{
  int vala,valb;
}d[size];

int n,m;

int cnt[100010],a[100010];

bool cmp(Q a,Q b)
{
  if(a.kuai==b.kuai)
  {
    if(a.kuai%2)
      return a.r<b.r;
    else
      return a.r>b.r;
  }
  return a.kuai<b.kuai;
}

bool cmp1(Q a,Q b)
{
  return a.id<b.id;
}

void add(int x)
{
  if(cnt[x]==0) d[x/400+1].vala++;
  cnt[x]++;
  d[x/400+1].valb++;
}

void del(int x)
{
  cnt[x]--;
  d[x/400+1].valb--;
  if(cnt[x]==0) d[x/400+1].vala--;
}

void find(int now,int a,int b)
{
  int ansa=0,ansb=0;
  /*
  for(int i=1;i<=(a-1)/400;i++)
  {
    ansa-=d[i].vala;
    ansb-=d[i].valb;
  }//x->x/400+1
  for(int i=(a-1)/400*400+1;i<=a-1;i++)
  {
    if(cnt[i]) ansa--;
    ansb-=cnt[i];
  }
  for(int i=1;i<=b/400;i++)
  {
    ansa+=d[i].vala;
    ansb+=d[i].valb;
  }
  for(int i=b/400*400+1;i<=b;i++)
  {
    if(cnt[i]) ansa++;
    ansb+=cnt[i];
  }
  */
  for(int i=a;i<=min((a/400+1)*400,b);i++)
  {
    if(cnt[i]) ansa++;
    ansb+=cnt[i];
  }
  if(a/400!=b/400)
  {
    for(int i=a/400+2;i<=b/400;i++)
    {
      ansa+=d[i].vala;
      ansb+=d[i].valb;
    }
    for(int i=(b/400)*400+1;i<=b;i++)
    {
      if(cnt[i]) ansa++;
      ansb+=cnt[i];
    }
  }
  q[now].ansa=ansa;
  q[now].ansb=ansb;
}

int main()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
  {
    scanf("%d",&a[i]);
  }
  for(int i=1;i<=m;i++)
  {
    scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].a,&q[i].b);
    q[i].id=i;
    q[i].kuai=(q[i].l/size)+1;
  }
  sort(q+1,q+m+1,cmp);
  int l=1,r=0;
  for(int i=1;i<=m;i++)
  {
    while(l>q[i].l)
    {
      l--;
      add(a[l]);
    }
    while(l<q[i].l)
    {
      del(a[l]);
      l++;
    }
    while(r<q[i].r)
    {
      r++;
      add(a[r]);
    }
    while(r>q[i].r)
    {
      del(a[r]);
      r--;
    }
    find(i,q[i].a,q[i].b);
  }
  sort(q+1,q+m+1,cmp1);
  for(int i=1;i<=m;i++)
  {
    printf("%d %d\n",q[i].ansb,q[i].ansa);
  }
}

2020/6/19 21:30
加载中...