传送门:
Gty的二逼妹子序列
Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1860 Solved: 558[][][]Description
Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题。
对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数。
为了方便,我们规定妹子们的美丽度全都在[1,n]中。
给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的种类数。
Input
第一行包括两个整数n,m(1<=n<=100000,1<=m<=1000000),表示数列s中的元素数和询问数。
第二行包括n个整数s1...sn(1<=si<=n)。
接下来m行,每行包括4个整数l,r,a,b(1<=l<=r<=n,1<=a<=b<=n),意义见题目描述。
保证涉及的所有数在C++的int内。
保证输入合法。
Output
对每个询问,单独输出一行,表示sl...sr中权值∈[a,b]的权值的种类数。
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
Sample Output
2 0 0 2 1 1 1 0 1 2
nsqrt(n)lgn算法秒出,卡时间。
nlg^2n算法秒出,卡空间。
于是我们可以对权值分块,O(1)修改,O(sqrt(n))查询。
1 #include2 #include 3 #include 4 const int maxn = 100005; 5 const int maxm = 1000006; 6 int read(){ 7 int rt=0,fl=1;char ch=getchar(); 8 while(ch<'0'||ch>'9'){ if(ch=='-')fl=-1;ch=getchar();} 9 while(ch>='0'&&ch<='9'){rt=rt*10+ch-'0';ch=getchar();}10 return rt*fl;11 } 12 struct query{13 int l,r,a,b,id;14 }mo[maxm];15 typedef long long ll;16 int block_size,pos1[maxn],cnt,c[maxn],r[1005],l[1005];17 int res[maxm];18 int bucket[1005];19 bool operator < (query a,query b){20 if(pos1[a.l]!=pos1[b.l])return a.l mo[i].r)del(data[R]),R--;70 while(L>mo[i].l)L--,add(data[L]);71 while(R