zoukankan      html  css  js  c++  java
  • “华为杯”山东理工大学第十一届ACM程序设计竞赛 H 3∑+1? (线段树)

    blem Description

    玄黄最近发明了一个神奇的函数:

    Xh(x)=3*( ∑(x的每一位) )+1 ,x为自然数。

    现在你面前有n个自然数,玄黄现在要求你完成两种操作 。
    1、帮玄黄求出这n个数中,区间 [l, r] 的和,并把答案告诉玄黄 。
    2、帮玄黄把区间 [l, r] 中的每一个数 x 都变成 Xh(x)。

    Input

    第一行输入一个正整数n(0 第二行输入n个自然数,下标从 1 至 n,每个自然数大小不超过 100000000003。 
    第三行输入一个正整数m(0 之后有m行,每行输入三个数op, l, r( 0 < op <3, 1 <= l <=r <=n ),op 代表玄黄要求你的操作编号,op 为 1 时执行第一种操作,op 为 2 时执行第二种操作,l 和 r 代表区间范围 。

    Output

    当 op 为 1 时,输出区间 [l, r] 的和,每次输出占一行。

      这是一个神奇的函数,,经过几次变换最后总能变成13...标记一下次数..赛后就a了.....

    #include<bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ls now<<1
    #define rs now<<1|1
    #define lson l,mid,ls
    #define rson mid+1,r,rs
    #define inf 0x3f3f3f3f
    #define int long long
    
    const int maxn=1e5+10;
    
    int tree[maxn*4],lazy[maxn*4];
    
    void built(int l,int r,int now)
    {
        int mid=(l+r)>>1;
        if(l==r)
        {
            scanf("%lld",&tree[now]);
            return ;
        }
        built(lson);
        built(rson);
        tree[now]=tree[ls]+tree[rs];
    }
    
    
    void updata(int l,int r,int now,int left,int right)
    {
        int mid=(l+r)>>1;
        if(lazy[now]>=50) return ;
        if(left<=l&&r<=right&&l==r)
        {
            int t=tree[now];
            int s=1;
            while(t)
            {
                s+=(t%10)*3;
                t/=10;
            }
            tree[now]=s;
           lazy[now]++;
            return ;
        }
        if(mid>=left) updata(lson,left,right);
        if(mid<right) updata(rson,left,right);
        tree[now]=tree[ls]+tree[rs];
        lazy[now]=min(lazy[ls],lazy[rs]);
    }
    
    int query(int l,int r,int now,int left,int right)
    {
        int mid=(l+r)>>1;
        if(left<=l&&r<=right)
        {
            return tree[now];
        }
        int ans=0;
        if(mid>=left) ans+=query(lson,left,right);
        if(mid<right) ans+=query(rson,left,right);
        tree[now]=tree[ls]+tree[rs];
        return ans;
    }
    
    
    #undef int
    int main()
    {
    #define int long long
        int n;
        scanf("%lld",&n);
        built(1,n,1);
        int m;
        scanf("%lld",&m);
        while(m--)
        {
            int cmd,l,r;
            scanf("%lld%lld%lld",&cmd,&l,&r);
            if(cmd==1)
                printf("%lld
    ",query(1,n,1,l,r));
            if(cmd==2)
                updata(1,n,1,l,r);
        }
        return 0;
    }
  • 相关阅读:
    VC.【转】采用_beginthread/_beginthreadex函数创建多线程
    Qt532.【转】Qt在pro中设置运行时库MT、MTd、MD、MDd,只适合VS版本的Qt
    Qt532界面.ZC测试
    Qt532.【转】Qt创建鼠标右键菜单
    VC.【转】窗口置于前台并激活的方法
    VS2010.STL::list的一个bug
    STL_map.VC6简单使用例子
    LeetCode题解-----Maximum Gap
    CEPH块设备创建及快照
    Ubuntu 14.04 部署 CEPH集群
  • 原文地址:https://www.cnblogs.com/minun/p/10927275.html
Copyright © 2011-2022 走看看