zoukankan      html  css  js  c++  java
  • bzoj 2724 蒲公英 分块

    分块,预处理出每两个块范围内的众数,然后在暴力枚举块外的进行比较

    那么怎么知道每一个数出现的次数呢?离散后,对于每一个数,维护一个动态数组就好了

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    #include<map>
    #define N 40005
    using namespace std;
    int a[N],be[N],n,m,nn,cnt,val[N],c[N],tot;
    int num[N];
    map<int,int> mm;
    vector <int > q[N];
    int f[205][205];
    int getnum(int l,int r,int x){
    	return upper_bound(q[x].begin(),q[x].end(),r)-lower_bound(q[x].begin(),q[x].end(),l);
    }
    int query(int l,int r){
    	int maxn=0,now=0;
    	if(be[l]==be[r]){
    		for(int i=l;i<=r;i++){
    			int t=getnum(l,r,c[i]);
    			if(t>maxn||(t==maxn&&a[i]<a[now])){
    				maxn=t; now=i;
    			}
    		}
    		return a[now];
    	}
    	now=f[be[l]+1][be[r]-1]; maxn=getnum(l,r,c[now]); 
    	for(int i=l;i<=be[l]*nn;i++){
    		int t=getnum(l,r,c[i]);
    		if(t>maxn||(t==maxn&&a[i]<a[now])){
    			maxn=t; now=i;}
    	}
    	for(int i=(be[r]-1)*nn+1;i<=r;i++){
    		int t=getnum(l,r,c[i]);
    		if(t>maxn||(t==maxn&&a[i]<a[now])){
    			maxn=t; now=i;}
    	}
    	return a[now];
    }
    int main()
    {
    	scanf("%d%d",&n,&m); 
    	nn=(int)sqrt(n);
    	for(int i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    		if(!mm.count(a[i])) mm[a[i]]=++cnt;
    		be[i]=(i-1)/nn+1;
    		c[i]=mm[a[i]];
    		q[c[i]].push_back(i);
    	}
    	tot=be[n]; int maxn,now;
    	for(int i=1;i<=tot;i++){
    		memset(num,0,sizeof(num)); maxn=0; now=0;
    		for(int j=(i-1)*nn+1;j<=n;j++){
    			num[c[j]]++;
    			if(num[c[j]]>maxn||(num[c[j]]==maxn&&a[j]<a[now])){
    				now=j; maxn=num[c[j]];
    			}
    			f[i][be[j]]=now;
    		}
    	}
    	int ans=0,l,r;
    	while(m--){
    		scanf("%d%d",&l,&r);
    		l=(l+ans-1+n)%n+1;
    		r=(r+ans-1+n)%n+1;
    		if(l>r) swap(l,r);
    		ans=query(l,r);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


  • 相关阅读:
    Python GUI编程(Tkinter)——Label and Button
    第一章——正则表达式(特殊符号和字符)
    最近用到的Blender相关技术总结
    第一章—正则表达式(简介/动机)
    发个随笔纪念Manim配置成功
    JUC并发工具的使用和原理
    线程启动与终止原理
    cpu缓存一致性
    布隆过滤器
    对象并不一定都是在堆上分配内存(逃逸分析)
  • 原文地址:https://www.cnblogs.com/Ren-Ivan/p/7746747.html
Copyright © 2011-2022 走看看