zoukankan      html  css  js  c++  java
  • 2014多校3 Wow! Such Sequence!段树

    主题链接:http://acm.hdu.edu.cn/showproblem.php?

    pid=4893

    这个问题还真是纠结啊……好久不写线段树的题了。由于这几天学伸展树。然后认为线段树小case了。没想到栽在这题上了。尼玛……

    自己把自己给搞晕了……想复杂了。都不懂得预处理一下,唉……还得怒刷几十道啊!

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <map>
    #include <cstdlib>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <ctype.h>
    #include <algorithm>
    #include <string>
    #include <set>
    #define PI acos(-1.0)
    #define MM 500015
    #define INF 0x7fffffff
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-8
    #define lson i<<1,l,mid
    #define rson i<<1|1,mid+1,r
    typedef long long ll;
    typedef unsigned long long ULL;
    using namespace std;
    long long Fib[91],sum[MM],fib[MM];
    int val[MM];
    int n;
    void init()
    {
        Fib[0]=1;
        Fib[1]=1;
        for(int i=2; i<92; i++)
            Fib[i]=Fib[i-1]+Fib[i-2];
    }
    void pushUp(int i)
    {
        sum[i]=sum[i<<1]+sum[i<<1|1];
        fib[i]=fib[i<<1]+fib[i<<1|1];
    }
    void pushDown(int i)
    {
        if(val[i])
        {
            val[i<<1]=1,val[i<<1|1]=1;
            sum[i<<1]=fib[i<<1],sum[i<<1|1]=fib[i<<1|1];
            val[i]=0;
        }
    }
    void update(int i,int l,int r,int L,int v)
    {
        if(l==r&&l==L)
        {
            sum[i]+=v;
            if(sum[i]<=1) {fib[i]=1;return;}
            int ii=lower_bound(Fib,Fib+92,sum[i])-Fib;
            if(Fib[ii]-sum[i]>=sum[i]-Fib[ii-1])
                fib[i]=Fib[ii-1];
            else fib[i]=Fib[ii];
            return ;
        }
        int mid=(l+r)>>1;
        pushDown(i);
        if(L>mid) update(rson,L,v);
        else update(lson,L,v);
        pushUp(i);
    }
    void update1(int i,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R)
        {
            sum[i]=fib[i];
            val[i]=1;
            return ;
        }
        int mid=(l+r)>>1;
        pushDown(i);
        if(R>mid) update1(rson,L,R);
        if(L<=mid) update1(lson,L,R);
        pushUp(i);
    }
    ll query(int i,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R) return sum[i];
        ll ans=0;
        int mid=(l+r)>>1;
        pushDown(i);
        if(R>mid) ans+=query(rson,L,R);
        if(L<=mid) ans+=query(lson,L,R);
        return ans;
    }
    void build(int i,int l,int r)
    {
        if(l==r)
        {
            sum[i]=val[i]=0;
            fib[i]=1;
            return ;
        }
        int mid=(l+r)>>1;
        build(lson);build(rson);
        pushUp(i);
        val[i]=0;
    }
    int main()
    {
        int m;
        init();
        while(~scanf("%d%d",&n,&m))
        {
            build(1,1,n);
            while(m--)
            {
                int a,l,r;
                scanf("%d%d%d",&a,&l,&r);
                if(a==1) update(1,1,n,l,r);
                else if(a==2) printf("%I64d
    ",query(1,1,n,l,r));
                else if(a==3) update1(1,1,n,l,r);
            }
        }
        return 0;
    }
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    JavaScript控制改变鼠标的形状
    web控件开发系列(四) 自定义控件属性(上)
    web控件开发系列() 基础介绍
    Web前端面试题 Js把URL中的参数解析为一个对象
    节点的操作 创建、添加、移除、移动、复制
    一个sohoto广告弹出页提取时间的Js修改过程
    FireFox支持innerText的方法
    Js 基于html5localStorage方法 制作的 "我的便签本"
    原生JavaScript对CSS进行格式化和压缩
    JavaScript 命名规则 变量命名规则
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4799909.html
Copyright © 2011-2022 走看看