zoukankan      html  css  js  c++  java
  • luogu P4137 Rmq Problem / mex 主席树 + 思维

    题目描述:

    求区间  $mex$ 值. 

    题解:用主席树维护每个点出现的最靠右的位置.
    当我们查询区间 $[l,r]$ 时,只需看一下 $[0,n]$ 在 $rt[r]$ 的线段树下每个点出现的最靠右的位置的最小值是否小于 $l$
    若小于 $l$ ,则一直贪心在线段树上向左走,直到走到叶子节点为止. 
    #include<bits/stdc++.h>
    #define maxn 200001  
    using namespace std;
    void setIO(string s)
    {
    	string in=s+".in"; 
    	freopen(in.c_str(),"r",stdin); 
    }
    namespace tr
    {
    	#define mid ((l+r)>>1) 
    	#define lson t[x].l
    	#define rson t[x].r 
    	struct Node
    	{
    		int l,r,minv,val; 
    	}t[maxn*30]; 
    	int cnt; 
    	int newnode() { return ++ cnt; }
    	void build(int &x,int l,int r)
    	{
    		x=newnode(); 
    		if(l==r) return; 
    		build(lson,l,mid), build(rson,mid+1,r); 
    	}
    	int insert(int u,int l,int r,int k,int delta)
    	{
    		int x=newnode(); 
    		t[x]=t[u];              
    		if(l==r) 
    		{ 
    			t[x].val=t[x].minv=delta; 
    			return x; 
    		}    
    		if(k<=mid) 
    		{
    			lson=insert(t[u].l, l, mid, k, delta);     
    		}
    		else 
    		{
    			rson=insert(t[u].r, mid + 1, r, k, delta);   
    		}
    		t[x].minv=maxn+233; 
    		if(lson) t[x].minv=min(t[x].minv,t[lson].minv); 
    		if(rson) t[x].minv=min(t[x].minv,t[rson].minv);                  	
    		return x;   
    	}
    	int query(int x,int l,int r,int k)
    	{
    		if(l==r) return l; 
    		if(t[lson].minv < k) return query(lson, l, mid, k); 
    		else return query(rson, mid + 1, r, k);   
    	}
    }; 
    int n,Q; 
    int arr[maxn],rt[maxn];   
    int main()
    {
    	int i,j,x,y,l,r;  
    	// setIO("input"); 
    	scanf("%d%d",&n,&Q); 
    	tr::build(rt[0],0,n+1); 
    	for(i=1;i<=n;++i)
    	{
    		scanf("%d",&arr[i]);        
    		arr[i]=min(arr[i], n + 1);       
    		rt[i]=tr::insert(rt[i-1],0,n+1,arr[i],i); 
    	} 
    	for(i=1;i<=Q;++i)
    	{
    		scanf("%d%d",&l,&r); 
    		printf("%d
    ",tr::query(rt[r], 0, n + 1, l));  
    	}
    	return 0; 
    }
    

      

  • 相关阅读:
    【贪心】闭区间问题
    【贪心】电视节目安排
    中石油-高精度阶乘-java
    hdu 6444 Neko's loop 单调队列优化DP
    hdu 3415 Max Sum of Max-K-sub-sequence 单调队列优化DP
    51nod 1050 循环数组最大子段和 单调队列优化DP
    hdu 6406 Taotao Picks Apples 线段树 单点更新
    Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询
    dp专题训练
    zoj 3747 递推dp
  • 原文地址:https://www.cnblogs.com/guangheli/p/11075517.html
Copyright © 2011-2022 走看看