zoukankan      html  css  js  c++  java
  • BZOJ 4370: [IOI2015]horses马 线段树+贪心+对数

    显然如果卖出的话肯定要在同一天卖出.  

    那么我们只需维护 $max(y_{i}prod x_{i})$ 即可.  

    乘法维护不了,取一个对数就好了. 

    code:

    #include <cstdio> 
    #include <cmath>
    #include <cstring>
    #include <algorithm>  
    #define N 500003 
    #define ll long long
    #define mod 1000000007 
    #define lson now<<1 
    #define rson now<<1|1   
    #define setIO(s) freopen(s".in","r",stdin)
    using namespace std; 
    double a[N],b[N];  
    int X[N],Y[N],n; 
    struct node 
    {     
        int id,sum2;    
        double maxv,sum;          
    }s[N<<2];  
    void pushup(int now) 
    {
        s[now].sum=s[lson].sum+s[rson].sum;
        s[now].sum2=(ll)s[lson].sum2*s[rson].sum2%mod;       
        if(s[lson].maxv>s[rson].maxv+s[lson].sum) 
        {   
            s[now].maxv=s[lson].maxv;  
            s[now].id=s[lson].id;  
        }
        else
        { 
            s[now].maxv=s[lson].sum+s[rson].maxv;    
            s[now].id=(ll)s[lson].sum2*s[rson].id%mod;       
        }
    }
    void build(int l,int r,int now) 
    {
        if(l==r) 
        {
           s[now].maxv=a[l]+b[l];     
           s[now].sum=a[l];       
           s[now].sum2=X[l]%mod;  
           s[now].id=(ll)X[l]*Y[l]%mod;       
           return;   
        }
        int mid=(l+r)>>1;    
        build(l,mid,lson),build(mid+1,r,rson),pushup(now);   
    }
    void update_x(int l,int r,int now,int p,int v) 
    {
        if(l==r) 
        {    
            X[p]=v;   
            a[p]=log2(v);    
            s[now].maxv=a[l]+b[l];    
            s[now].sum=a[l];  
            s[now].sum2=X[l]%mod;    
            s[now].id=(ll)X[l]*Y[l]%mod;   
            return;  
        }
        int mid=(l+r)>>1;   
        if(p<=mid) update_x(l,mid,lson,p,v);  
        else update_x(mid+1,r,rson,p,v);  
        pushup(now); 
    }
    void update_y(int l,int r,int now,int p,int v) 
    {
        if(l==r) 
        {
            Y[p]=v;   
            b[p]=log2(v);  
            s[now].maxv=a[l]+b[l];        
            s[now].sum=a[l];    
            s[now].id=(ll)X[l]*Y[l]%mod;      
            return; 
        }
        int mid=(l+r)>>1;  
        if(p<=mid) update_y(l,mid,lson,p,v);   
        else update_y(mid+1,r,rson,p,v);   
        pushup(now);   
    }
    int main()
    { 
        // setIO("input"); 
        int i,j,m;              
        scanf("%d",&n);   
        for(i=1;i<=n;++i) scanf("%d",&X[i]),a[i]=log2(X[i]);             
        for(i=1;i<=n;++i) scanf("%d",&Y[i]),b[i]=log2(Y[i]);     
        build(1,n,1);     
        scanf("%d",&m);   
        printf("%d
    ",s[1].id);  
        while(m--) 
        {   
            int w,e,r;  
            scanf("%d%d%d",&w,&e,&r),++e;  
            if(w==1) 
            {  
                update_x(1,n,1,e,r);   
            }
            else
            { 
                update_y(1,n,1,e,r);  
            }
            printf("%d
    ",s[1].id);  
        }
        return 0;
    }
    

      

  • 相关阅读:
    MyEclipse控制台输出tomcat红字
    struts标签bean:define
    字节流转换为对象的方法
    C#将jpg格式图片合成到bmp格式图片中
    [置顶]C#中Socket服务端代码分享
    [置顶] C#中Socket服务端代码分享
    [置顶] 使用Joson的格式字符串在Socket中通讯时数据格式的转换
    [置顶] AMF序列化为对象和AMF序列化为二进制字节流
    用C#获取CPU编号、硬盘编号等系统有关环境、属性
    别把紧张情绪带回家 下班后的10个最佳放松法
  • 原文地址:https://www.cnblogs.com/guangheli/p/12263733.html
Copyright © 2011-2022 走看看