zoukankan      html  css  js  c++  java
  • bzoj3524: [Poi2014]Couriers / bzoj2223: [Coci 2009]PATULJCI 主席树

    主席树模板题目

    #include<bits/stdc++.h>
    using namespace std;
    int root[500010],a[500010],hash[500010],dd,n,m,len=0,sum[15000000],l[15000000],r[15000000];
    int maketree(int L,int R)
    {
    	int rt=++len;
    	sum[rt]=0;
    	if(L<R)
    	{
    		int mid=(L+R)>>1;
    		l[rt]=maketree(L,mid);
    		r[rt]=maketree(mid+1,R);
    	}
    	return rt;
    }
    int update(int pre,int L,int R,int x)
    {
    	int rt=++len;
    	l[rt]=l[pre];
    	r[rt]=r[pre];
    	sum[rt]=sum[pre]+1;
    	if(L<R)
    	{
    		int mid=(L+R)>>1;
    		if(x<=mid)l[rt]=update(l[pre],L,mid,x);
    		else r[rt]=update(r[pre],mid+1,R,x);
    	}
    	return rt;
    }
    int query(int x,int y,int L,int R,int X)
    {
    	if(L>=R)
    	{
    		if(sum[y]-sum[x]>X)return L;
    		else return 0;
    	}
    	int sum1=sum[l[y]]-sum[l[x]],sum2=sum[r[y]]-sum[r[x]];
    	int mid=(L+R)>>1;
    	if(sum1>X)return query(l[x],l[y],L,mid,X);
    	else if(sum2>X)return query(r[x],r[y],mid+1,R,X);
    	else return 0;
    }
    int main()
    {
    	//freopen("xf.in","r",stdin);
    	//freopen("xf.out","w",stdout);
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		hash[i]=a[i];
    	}
    	sort(hash+1,hash+n+1);
    	dd=unique(hash+1,hash+n+1)-hash-1;
    	root[0]=maketree(1,dd);
    	for(int i=1;i<=n;i++)
    	{
    		int x=lower_bound(hash+1,hash+dd+1,a[i])-hash;
    		root[i]=update(root[i-1],1,dd,x);
    	}
    	int x,y;
    	while(m--)
    	{
    		scanf("%d%d",&x,&y);
    		int ans=query(root[x-1],root[y],1,dd,(y-x+1)/2);
    		printf("%d
    ",hash[ans]);
    	}
    	return 0;
    }
    

      

    #include<bits/stdc++.h>
    using namespace std;
    int w,root[500010],a[500010],hash[500010],dd,n,m,len=0,sum[15000000],l[15000000],r[15000000];
    int maketree(int L,int R)
    {
        int rt=++len;
        sum[rt]=0;
        if(L<R)
        {
            int mid=(L+R)>>1;
            l[rt]=maketree(L,mid);
            r[rt]=maketree(mid+1,R);
        }
        return rt;
    }
    int update(int pre,int L,int R,int x)
    {
        int rt=++len;
        l[rt]=l[pre];
        r[rt]=r[pre];
        sum[rt]=sum[pre]+1;
        if(L<R)
        {
            int mid=(L+R)>>1;
            if(x<=mid)l[rt]=update(l[pre],L,mid,x);
            else r[rt]=update(r[pre],mid+1,R,x);
        }
        return rt;
    }
    int query(int x,int y,int L,int R,int X)
    {
        if(L>=R)
        {
            if(sum[y]-sum[x]>X)return L;
            else return 0;
        }
        int sum1=sum[l[y]]-sum[l[x]],sum2=sum[r[y]]-sum[r[x]];
        int mid=(L+R)>>1;
        if(sum1>X)return query(l[x],l[y],L,mid,X);
        else if(sum2>X)return query(r[x],r[y],mid+1,R,X);
        else return 0;
    }
    int main()
    {
        //freopen("xf.in","r",stdin);
        //freopen("xf.out","w",stdout);
        scanf("%d%d",&n,&w);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            hash[i]=a[i];
        }
        scanf("%d",&m);
        sort(hash+1,hash+n+1);
        dd=unique(hash+1,hash+n+1)-hash-1;
        root[0]=maketree(1,dd);
        for(int i=1;i<=n;i++)
        {
            int x=lower_bound(hash+1,hash+dd+1,a[i])-hash;
            root[i]=update(root[i-1],1,dd,x);
        }
        int x,y;
        while(m--)
        {
            scanf("%d%d",&x,&y);
            int ans=query(root[x-1],root[y],1,dd,(y-x+1)/2);
            if(ans==0)printf("no
    ");
            else printf("yes %d
    ",hash[ans]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    redis深度理解底层锁原理
    深度完整的了解MySQL锁
    今天的文章很不一般
    利用h5来进行定位当前位置
    workerman(环境+初识)
    Nginx(防止压力测试的恶意攻击)
    Java Web框架——自己动手实现一个简化版的Spring IOC框架
    设计模式——策略模式
    数据库——深入理解MySQL事务
    缓存——Redis和Memcache的对比
  • 原文地址:https://www.cnblogs.com/mybing/p/8550263.html
Copyright © 2011-2022 走看看