zoukankan      html  css  js  c++  java
  • 莫队算法板子

    FZSZ Online Judge #36 C. 【Noip模拟 20161015】众数查询

    题目描述

    给你n个数a1,a2,...,an以及q个询问[L,R],对于每个询问,回答[L,R]中的数的众数的出现次数是多少。

    输入格式

    第一行一个整数n

    第二行n个整数,a1,a2,...,an

    第三行一个整数q

    接下来q行,每行两个整数L,R,表示一组询问。

    输出格式

    对于每个询问,每行表示相应询问的答案。

    样例输入

    5
    1 1 2 2 3
    3
    1 2
    2 5
    1 5

    样例输出

    2
    2
    2

    数据范围

    对于20%的数据,n100,q100.

    对于40%的数据,n100,q104.

    对于80%的数据,n1000,q2×104.

    对于100%的数据,1n,q8×104,0ai106.

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #define BIG 80011
    #define MAX 1000011
    #define FOR(i,s,t) for(register int i=s;i<=t;++i)
    using namespace std;
    struct ques{
    	int l;
    	int r;
    	int bs;
    }Q[BIG];
    int a[BIG],f[MAX],have[BIG],ans[BIG];
    int n,m,p,q,l,r;
    inline int read(){
    	char c=getchar();
    	int data=0,w=1;
    	while((c>'9'||c<'0')&&c!='-')
    		c=getchar();
    	if(c=='-')
    		w=-1,c=getchar();
    	while(c>='0'&&c<='9')
    		data=(data<<1)+(data<<3)+c-48,c=getchar();
    	return data*w;
    }
    int wr[51];
    inline void write(int x){
    	if(x<0)
    		x=-x,putchar('-');
    	if(x==0){
    		putchar(48);
    		putchar('
    ');
    		return ;
    	}
    	while(x)
    		wr[++wr[0]]=x%10,x/=10;
    	while(wr[0])
    		putchar(48+wr[wr[0]--]);
    	putchar('
    ');
    }
    inline bool cmp(ques a,ques b){
    	return a.l/m<b.l/m||a.l/m==b.l/m&&a.r<b.r;
    }
    inline void add(int x){
    	++have[x];
    	++f[have[x]];
    	--f[have[x]-1];
    	if(have[x]>p)
    		p=have[x];
    }
    inline void cancel(int x){
    	--have[x];
    	--f[have[x]+1];
    	++f[have[x]];
    	if(!f[p]&&p==have[x]+1)
    		p=have[x];
    }
    int main(){
    	n=read();
    	FOR(i,1,n)
    		a[i]=read();
    	q=read();
    	FOR(i,1,q)
    		Q[i].l=read(),Q[i].r=read(),Q[i].bs=i;
    	m=sqrt(n);
    	sort(Q+1,Q+q+1,cmp);
    	l=1;
    	r=0;
    	FOR(i,1,q){
    		while(Q[i].r>r)
    			add(a[++r]);
    		while(Q[i].r<r)
    			cancel(a[r--]);
    		while(Q[i].l<l)
    			add(a[--l]);
    		while(Q[i].l>l)
    			cancel(a[l++]);
    		ans[Q[i].bs]=p;
    	}
    	FOR(i,1,q)
    		write(ans[i]);
    	return 0;
    }
    

      

  • 相关阅读:
    增长思维——模式&&组织
    BackUP
    增长思维——机会
    Android
    增长思维——作战地图
    Server架构 小知识
    Server
    产品思维——创新模式
    产品思维——用户体验
    博客迁移到~http://zhulingyu.com
  • 原文地址:https://www.cnblogs.com/Stump/p/7687433.html
Copyright © 2011-2022 走看看