zoukankan      html  css  js  c++  java
  • [BZOJ3809]Gty的二逼妹子序列

    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


    首先想到高级数结,然后发现28M???时限80s???

    这是逼着我莫队吗?结果一算空间,还真是卡着让你莫队。。。

    注意最后统计答案的时候不能用树状数组。。。要分块。。。

    因为(O(nsqrt nlog n))过不了

    /*program from Wolfycz*/
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x7f7f7f7f
    #define lowbit(x) ((x)&(-x))
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline char gc(){
    	static char buf[1000000],*p1=buf,*p2=buf;
    	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    inline int frd(){
    	int x=0,f=1; char ch=gc();
    	for (;ch<'0'||ch>'9';ch=gc())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=gc())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline int read(){
    	int x=0,f=1; char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')	f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<3)+(x<<1)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x<0)	putchar('-'),x=-x;
    	if (x>9)	print(x/10);
    	putchar(x%10+'0');
    }
    const int N=1e5,M=1e6;
    int pos[N+10],col[N+10],Ans[M+10],cnt[N+10];
    int n,m,size;
    struct S1{
    	int l,r,ID,a,b;
    	void insert(int i){l=read(),r=read(),a=read(),b=read(),ID=i;}
    	bool operator <(const S1 &tis)const{return pos[l]!=pos[tis.l]?l<tis.l:r<tis.r;}
    }A[M+10];
    struct S2{
    	int val[350];
    	void insert(int x,int v){val[pos[x]]+=v;}
    	int Query(int l,int r){
    		int res=0;
    		for (int i=l;i<=min(pos[l]*size,r);i++)	res+=(cnt[i]>0);
    		if (pos[l]!=pos[r])
    			for (int i=(pos[r]-1)*size+1;i<=r;i++)
    				res+=(cnt[i]>0);
    		for (int i=pos[l]+1;i<pos[r];i++)	res+=val[i];
    		return res;
    	}
    }Block;
    void insert(int x,int v){
    	int tmp=cnt[col[x]]+v;
    	if (cnt[col[x]]&&!tmp)	Block.insert(col[x],-1);
    	if (!cnt[col[x]]&&tmp)	Block.insert(col[x], 1);
    	cnt[col[x]]+=v;
    }
    int main(){
    	n=read(),m=read(),size=(int)(sqrt(n));
    	for (int i=1;i<=n;i++)	col[i]=read(),pos[i]=(i-1)/size+1;
    	for (int i=1;i<=m;i++)	A[i].insert(i);
    	sort(A+1,A+1+m);
    	for (int i=1,l=1,r=0;i<=m;i++){
    		while (r<A[i].r)	insert(++r, 1);
    		while (r>A[i].r)	insert(r--,-1);
    		while (l<A[i].l)	insert(l++,-1);
    		while (l>A[i].l)	insert(--l, 1);
    		Ans[A[i].ID]=Block.Query(A[i].a,A[i].b);
    	}
    	for (int i=1;i<=m;i++)	print(Ans[i]),putchar('
    ');
    	return 0;
    }
    
  • 相关阅读:
    监听器heMQ组合的入门练习
    错误积累
    测试cxf 客户端
    day18-1-17获取界面参数
    Station 项目注意事项
    cxf_spring的结合
    ws_cxf入门 错误
    Oracle游标
    Oracle存储函数,存储过程
    Oracle查询
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/10004086.html
Copyright © 2011-2022 走看看