• BZOJ.4299.Codechef FRBSUM(主席树)


    BZOJ
    DBZOJ

    记mx为最大的满足1~mx都能组成的数。
    考虑当前能构成1~v中的所有数,再加入一个数x,若x>v+1,则mx=v,x不会产生影响;否则x<=v+1,则新的mx=x+v。
    对于区间[l,r]的询问,模拟这个过程。假设当前答案为v,查询[l,r]中值在[1,v+1]中的数的和sum,若sum==v,即不存在v+1,break;否则v加上这些v+1的和即v=sum,继续。
    用主席树实现。v每次至少增加一倍(好像这么说不恰当,每次加的数至少是上一个数+1?),所以复杂度(O(nlog nlog a))

    为什么跑的比较慢呢。。

    //38224kb	2860ms
    #include <cstdio>
    #include <cctype>
    #include <algorithm>
    //#define gc() getchar()
    #define MAXIN 300000
    #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
    const int N=1e5+5;
    
    int A[N],root[N];
    char IN[MAXIN],*SS=IN,*TT=IN;
    struct Tree
    {
    	#define S N*31//loga not logn && 31 not 30...
    	#define lson son[x][0]
    	#define rson son[x][1]
    	int tot,sum[S],son[S][2];
    
    	inline void Insert(int x,int &y,int l,int r,int p)
    	{
    		sum[y=++tot]=sum[x]+p;
    		if(l==r) return;
    		int m=l+r>>1;
    		if(p<=m) son[y][1]=rson, Insert(lson,son[y][0],l,m,p);
    		else son[y][0]=lson, Insert(rson,son[y][1],m+1,r,p);
    	}
    	int Query(int x,int y,int l,int r,int R)
    	{
    		if(r<=R) return sum[y]-sum[x];
    		int m=l+r>>1;
    		if(m<R) return sum[son[y][0]]-sum[lson]+Query(rson,son[y][1],m+1,r,R);
    		else return Query(lson,son[y][0],l,m,R);
    	}
    }T;
    
    inline int read()
    {
    	int now=0;register char c=gc();
    	for(;!isdigit(c);c=gc());
    	for(;isdigit(c);now=now*10+c-'0',c=gc());
    	return now;
    }
    
    int main()
    {
    	int n=read(); int R=1;
    	for(int i=1; i<=n; ++i) R+=(A[i]=read());
    	for(int i=1; i<=n; ++i) T.Insert(root[i-1],root[i],1,R,A[i]);
    	for(int m=read(),l,r,ans,sum; m--; )
    	{
    		l=read(),r=read(),ans=0;
    		while(ans<(sum=T.Query(root[l-1],root[r],1,R,ans+1))) ans=sum;
    		printf("%d
    ",ans+1);
    	}
    	return 0;
    }
    
    ------------------------------------------------------------------------------------------------------------------------
    无心插柳柳成荫才是美丽
    有哪种美好会来自于刻意
    这一生波澜壮阔或是不惊都没问题
    只愿你能够拥抱那种美丽
    ------------------------------------------------------------------------------------------------------------------------
  • 相关阅读:
    C++入门经典-例4.9-输出不同生命周期的变量值
    C++入门经典-例4.8-同名的全局变量和局部变量
    C++入门经典-例4.7-变量的作用域
    C++入门经典-例4.6-使用重载函数
    C++入门经典-例4.5-利用循环求n的阶乘
    C++入门经典-例4.4-循环嵌套之求n的阶乘
    C++入门经典-例4.3-函数的递归调用之汉诺塔问题
    C++入门经典-例4.2-调用默认参数的函数
    C++入门经典-例4.1-声明、定义和使用函数
    C++入门经典-例3.25-使用循环输出闰年
  • 原文地址:https://www.cnblogs.com/SovietPower/p/9636966.html
Copyright © 2020-2023  润新知