不知道哪里锅了,后面三个点过不去。。。
逐行对比题解也不知道错在哪,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);
}
}