zoukankan      html  css  js  c++  java
  • LuoguP4396 [AHOI2013]作业

    题面


    分析

    看到求出现次数不难想到莫队。接下来考虑如何处理([a,b])的问题。设(cnt[i])表示(i)出现的次数,那么询问等价于求(Sigma^b_{i=a}cnt_i),显然可以通过维护rmq数据结构完成。第二问同理之。

    代码

    /*
    By Nero Claudius Caeser Augustus Germanicus,
    Imeratorum Romanorum.
    */
    #include <bits/stdc++.h>
    
    using namespace std;
    
    namespace StandardIO{
    
    	template<typename T>void read(T &x){
    		x=0;T f=1;char c=getchar();
    		for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
    		for(; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
    		x*=f;
    	}
    
    	template<typename T>void write(T x){
    		if(x<0) putchar('-'),x*=-1;
    		if(x>=10) write(x/10);
    		putchar(x%10+'0');
    	}
    
    } using namespace StandardIO;
    
    namespace Project{
    	
    	const int N=100000+100;
    	
    	int n,m,block;
    	int a[N];
    	struct node{
    		int l,r,a,b,id;
    	} ask[N];
    	int l,r,res,cnt[N][2],c[N],ans[N][2];
    	
    	inline bool cmp(const node x,const node y){
    		return (x.l/block!=y.l/block)?(x.l/block<y.l/block):(((x.l/block)&1)?x.r<y.r:x.r>y.r);
    	}
    #define lowbit(x) x&(-x)
    	void update(int x,int v,int t){
    		for(; x<=n; x+=lowbit(x)) cnt[x][t]+=v;
    	}
    	int query(int x,int t){
    		int res=0;
    		for(; x; x-=lowbit(x)) res+=cnt[x][t];
    		return res;
    	}
    	void add(int x){
    		x=a[x],++c[x];
    		update(x,1,0);
    		if(c[x]==1) update(x,1,1);
    	}
    	void del(int x){
    		x=a[x],--c[x];
    		update(x,-1,0);
    		if(c[x]==0) update(x,-1,1);
    	}
    
    	void MAIN(){
    		read(n),read(m),block=sqrt(n);
    		for(int i=1; i<=n; ++i){
    			read(a[i]);
    		}
    		for(int i=1; i<=m; ++i){
    			read(ask[i].l),read(ask[i].r),read(ask[i].a),read(ask[i].b),ask[i].id=i;
    		}
    		sort(ask+1,ask+m+1,cmp);
    		l=1,r=0;
    		for(int i=1; i<=m; ++i){
    			while(l>ask[i].l) add(--l);
    			while(r<ask[i].r) add(++r);
    			while(l<ask[i].l) del(l++);
    			while(r>ask[i].r) del(r--);
    			ans[ask[i].id][0]=query(ask[i].b,0)-query(ask[i].a-1,0);
    			ans[ask[i].id][1]=query(ask[i].b,1)-query(ask[i].a-1,1);
    		}
    		for(int i=1; i<=m; ++i){
    			write(ans[i][0]),putchar(' '),write(ans[i][1]),puts("");
    		}
    	}
    	
    }
    
    int main(){
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	Project::MAIN();
    }
    
    
  • 相关阅读:
    为什么 TCP 建立连接是三次握手,关闭连接确是四次挥手呢?
    一文搞懂 Java 中的枚举,写得非常好!
    IntelliJ IDEA For Mac 快捷键,够骚,速度收藏!
    Java Bean 为什么必须要有一个无参构造函数?
    18 个示例带你掌握 Java 8 日期时间处理!
    从入门到熟悉 HTTPS 的 9 个问题
    MyBatis的动态SQL详解
    MyBatis总结-实现关联表查询
    AngularJS
    Spring MVC url提交参数和获取参数
  • 原文地址:https://www.cnblogs.com/ilverene/p/13334167.html
Copyright © 2011-2022 走看看