zoukankan      html  css  js  c++  java
  • 【CODEVS1369】xth 砍树

    Description

    在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树。为啥米要砍树呢?是这样滴,
    小菜儿的儿子窄森要出生了。Xth这个做伯伯的自然要做点什么。于是他决定带着
    rabbit 去收集一些木材,给窄森做一个婴儿车……(xth 早就梦想着要天天打菜儿
    他儿窄森的小 pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪
    啪……“乌卡卡——”xth 邪恶滴笑了,“不要告诉 rabbit,她会说我缺德的……”
    xth 如是说)。
    花园里共有n棵树。为了花园的整体形象,rabbit 要求 xth只能在m个区域砍伐,我
    们可以将这m个区域看成m个区间,树的间距相等,都是1,我们将每个区间设为
    [x, y]。那么长度为k的区间中就有k棵树。树木的高度不等。现在 xth 想测量一下,
    每个区间树木砍伐后所得的木材量是多少,而且每次测量后他都会砍下标号为
    (x+y)/2
    的那棵作为纪念。以方便他安排人手。(同一个区间的树木可以重复砍伐,我们认
    为被砍过的树木高度为0)
    每棵树的木材量=树的高度∗ 3.14(注意是3.14不是π)。

    Input

    第一行,一个整数n。
    第二行,共n个整数,表示每棵树的高度。
    第三行,一个整数m,表示共m个区间。
    以下m行,每个区间[x, y]的左右端点x, y。

    Output

    共m行,每行一个数,表示每个区间的木材量。

    结果精确到小数点后两位。

    Sample Input

    5
    1 2 3 4 5
    2
    1 4
    2 4

    Sample Output

    31.40
    21.98

    HINT

    对于30%的数据,有n ≤ 5000,m ≤ 5000;
    对于100%的数据,有n ≤ 200000,m ≤ 200000;

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int maxn=200010;
    int tot=0;
    int d[maxn];
    struct treetype
    {
        int Left,Right;
        int lptr,rptr;
        int sum; //区间和 
    }t[maxn*2];
    void buildtree(int ll,int rr)
    {
        int cur=++tot;
        t[cur].Left=ll; t[cur].Right=rr;
        if (ll!=rr-1)
        {
            t[cur].lptr=tot+1;    buildtree(ll,(ll+rr)/2);
            t[cur].rptr=tot+1;    buildtree((ll+rr)/2,rr);
            t[cur].sum=t[t[cur].lptr].sum+t[t[cur].rptr].sum;
        }else t[cur].sum=d[ll];
    }
    int query(int k,int ll,int rr)//区间查询 
    {
        if (ll<=t[k].Left && rr>=t[k].Right) return t[k].sum;
        int ans=0;
        if (ll<(t[k].Left+t[k].Right)/2) ans+=query(t[k].lptr,ll,rr);
        if (rr>(t[k].Left+t[k].Right)/2) ans+=query(t[k].rptr,ll,rr);
        return ans;
    }
    
    void change(int k,int p)//单位区间清零 
    {
        if (t[k].Right-t[k].Left==1) t[k].sum=0;
        else
        {
            if (p<(t[k].Left+t[k].Right)/2) change(t[k].lptr,p);
            if (p>=(t[k].Left+t[k].Right)/2) change(t[k].rptr,p);
            t[k].sum=t[t[k].lptr].sum+t[t[k].rptr].sum;
        }
    }
    
    int main()
    {
        int n,m,x,y;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&d[i]);
        buildtree(1,n+1);
        scanf("%d",&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%.2lf
    ",(double)query(1,x,y+1)*3.14);
            change(1,(x+y)/2);
        }
    }
  • 相关阅读:
    快速理解平衡二叉树、B-tree、B+tree、B*tree
    centos 7(6) linux系统安装 mysql5.7.17(glibc版)
    关于使用Hibernate+spring+dubbo的实现微服务对象查询
    Keepalived+Nginx实现高可用(HA)
    Nginx源码安装
    Keepalived安装与配置
    单点fastDfs+centos7搭建
    Dubbo+zookeeper使用方法以及注意事项
    mac 下 iterm2 不能使用 rz sz
    java 无符号整型
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5118664.html
Copyright © 2011-2022 走看看