1 条题解

  • 0
    @ 2025-8-24 22:28:10

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar iMya_nlgau
    ありがとう

    搬运于2025-08-24 22:28:10,当前版本为作者最后更新于2022-01-14 10:51:51,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    因为这是一道黄题,所以不用主席树或者莫队这些算法。

    我们对每种颜色开一个 vector 存下该颜色出现位置的下标,这样给定一个区间 [l,r][l,r] 和一个颜色 cc 我们就可以在 vector 里二分求出 [l,r][l,r]cc 出现的次数,具体地,v[c] 表示颜色 cc 下标的 vector,那么

    upper_bound(v[c].begin(),v[c].end(),r)-lower_bound(v[c].begin(),v[c].end(),l);
    

    就是 [l,r][l,r]cc 出现的次数。

    然后再考虑,如果一个颜色 cc 在长度为 kk 的区间里出现了超过 k2\dfrac{k}{2} 次,那么我们在这个区间里随机 tt 次,每次随机一个位置,遇不到 cc 的概率小于 12t\dfrac{1}{2^t},当 tt5050 的时候这个概率大约是 101510^{-15},可以认为不可能发生。

    所以对于每个询问 [l,r][l,r],我们在 [l,r][l,r] 中随机 tt 次,再判断每次随机到的颜色出现次数是否大于 rl+12\dfrac{r-l+1}{2} 即可。

    时间复杂度 O(mtlogn)O(mt\log n)tt 为随机次数。tt2020 的话我的代码是目前最优解。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    #include<vector>
    #include<cstdlib>
    #include<ctime>
    using namespace std;
    
    inline int read(){
    	int x=0; char c=getchar();
    	while(!isdigit(c)) c=getchar();
    	while(isdigit(c)) x=x*10+(c^'0'),c=getchar();
    	return x;
    }
    
    const int maxn=3e5+10;
    const int maxm=1e4+10;
    
    int n,c,m,a[maxn];
    vector<int> v[maxm];
    
    inline int query(int l,int r){
    	for(int t=1;t<=50;t++){
    		int p=l+rand()%(r-l+1);
    		int res=upper_bound(v[a[p]].begin(),v[a[p]].end(),r)
    			-lower_bound(v[a[p]].begin(),v[a[p]].end(),l);
    		if(res>(r-l+1)/2) return a[p];
    	}
    	return -1;
    }
    
    int main(){
    	srand((unsigned)time(NULL));
    	
    	n=read(),c=read();
    	for(int i=1;i<=n;i++)
    		a[i]=read(),v[a[i]].push_back(i);
    
    	for(int i=1;i<=c;i++) v[i].push_back(n+1);
    	
    	m=read();
    	while(m--){
    		int l=read(),r=read();
    		int ans=query(l,r);
    		if(~ans) printf("yes %d\n",ans);
    		else puts("no");
    	}
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    5830
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者