# 【BZOJ3809】Gty的二逼妹子序列

## Description

Autumn和Bakser又在研究Gty的妹子序列了！但他们遇到了一个难题。

## Sample Input

10 10
4 4 5 1 4 1 5 1 2 1
5 9 1 2
3 4 7 9
4 4 2 5
2 3 4 7
5 10 4 4
3 9 1 1
1 4 5 9
8 9 3 3
2 2 1 6
8 9 1 4

2
0
0
2
1
1
1
0
1
2

## HINT

5 9 1 2

3 4 7 9

4 4 2 5

2 3 4 7

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m,siz;
struct node
{
int qa,qb,ql,qr,org;
}q[1000010];
int v[100010],sk[100010],s[100010],ans[1000010];
int rd()
{
int ret=0;	char gc=getchar();
while(gc<'0'||gc>'9')	gc=getchar();
while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
return ret;
}
bool cmp(node a,node b)
{
if((a.ql-1)/siz==(b.ql-1)/siz)	return a.qr<b.qr;
return (a.ql-1)/siz<(b.ql-1)/siz;
}
int main()
{
n=rd(),m=rd();
siz=(int)sqrt((double)n);
int i,j;
for(i=1;i<=n;i++)	v[i]=rd();
for(i=1;i<=m;i++)	q[i].ql=rd(),q[i].qr=rd(),q[i].qa=rd(),q[i].qb=rd(),q[i].org=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(i=1;i<=m;i++)
{
while(r<q[i].qr)	r++,sk[(v[r]-1)/siz]+=(s[v[r]]==0),s[v[r]]++;
while(r>q[i].qr)	s[v[r]]--,sk[(v[r]-1)/siz]-=(s[v[r]]==0),r--;
while(l>q[i].ql)	l--,sk[(v[l]-1)/siz]+=(s[v[l]]==0),s[v[l]]++;
while(l<q[i].ql)	s[v[l]]--,sk[(v[l]-1)/siz]-=(s[v[l]]==0),l++;
if((q[i].qa-1)/siz==(q[i].qb-1)/siz)
{
for(j=q[i].qa;j<=q[i].qb;j++)	ans[q[i].org]+=(s[j]>0);
continue;
}
for(j=q[i].qa;j<=(q[i].qa-1)/siz*siz+siz&&j<=n;j++)	ans[q[i].org]+=(s[j]>0);
for(j=(q[i].qb-1)/siz*siz+1;j<=q[i].qb;j++)	ans[q[i].org]+=(s[j]>0);
for(j=(q[i].qa-1)/siz+1;j<(q[i].qb-1)/siz;j++)	ans[q[i].org]+=sk[j];
}
for(i=1;i<=m;i++)	printf("%d\n",ans[i]);
return 0;
}

## 【BZOJ3236】[Ahoi2013]作业

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m,siz;
struct node
{
int qa,qb,ql,qr,org;
}q[1000010];
int v[100010],sk[100010],sv[100010],s[100010],ans[1000010],sum[1000010];
int rd()
{
int ret=0;	char gc=getchar();
while(gc<'0'||gc>'9')	gc=getchar();
while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
return ret;
}
bool cmp(node a,node b)
{
if((a.ql-1)/siz==(b.ql-1)/siz)	return a.qr<b.qr;
return (a.ql-1)/siz<(b.ql-1)/siz;
}
int main()
{
n=rd(),m=rd();
siz=(int)sqrt((double)n);
int i,j;
for(i=1;i<=n;i++)	v[i]=rd();
for(i=1;i<=m;i++)	q[i].ql=rd(),q[i].qr=rd(),q[i].qa=rd(),q[i].qb=rd(),q[i].org=i;
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(i=1;i<=m;i++)
{
while(r<q[i].qr)	r++,sk[(v[r]-1)/siz]+=(s[v[r]]==0),s[v[r]]++,sv[(v[r]-1)/siz]++;
while(r>q[i].qr)	s[v[r]]--,sv[(v[r]-1)/siz]--,sk[(v[r]-1)/siz]-=(s[v[r]]==0),r--;
while(l>q[i].ql)	l--,sk[(v[l]-1)/siz]+=(s[v[l]]==0),s[v[l]]++,sv[(v[l]-1)/siz]++;
while(l<q[i].ql)	s[v[l]]--,sv[(v[l]-1)/siz]--,sk[(v[l]-1)/siz]-=(s[v[l]]==0),l++;
if((q[i].qa-1)/siz==(q[i].qb-1)/siz)
{
for(j=q[i].qa;j<=q[i].qb;j++)	ans[q[i].org]+=(s[j]>0),sum[q[i].org]+=s[j];
continue;
}
for(j=q[i].qa;j<=(q[i].qa-1)/siz*siz+siz&&j<=n;j++)	ans[q[i].org]+=(s[j]>0),sum[q[i].org]+=s[j];
for(j=(q[i].qb-1)/siz*siz+1;j<=q[i].qb;j++)	ans[q[i].org]+=(s[j]>0),sum[q[i].org]+=s[j];
for(j=(q[i].qa-1)/siz+1;j<(q[i].qb-1)/siz;j++)	ans[q[i].org]+=sk[j],sum[q[i].org]+=sv[j];
}
for(i=1;i<=m;i++)	printf("%d %d\n",sum[i],ans[i]);
return 0;
}

| 欢迎来原网站坐坐！ >原文链接<

posted @ 2017-05-04 09:19  CQzhangyu  阅读(192)  评论(0编辑  收藏  举报