【HDU3333】图灵数 Turing Tree

本文介绍了一个用于维护不重复数字的数值综合管理系统。该系统通过构建树状数据结构来实现数值的增删查改,并能够有效地处理数值综合查询,提供查询结果的数值总和。
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Scanner;
/*
维护不重复数字的数值综合
*/
public class Main {
    static Scanner input = new Scanner(System.in);
    static Node[] tree;
    static ArrayList<Double> search;
    static int num;
    static class Node{
        double value;
        ArrayList<Double> list;
        //建立最下级顶点
        Node(Double value){
            this.value = value;
            list = new ArrayList();
            list.add(value);
        }
        
        //建立除了最下级顶点
        Node(int x,int y){
            double value = 0;
            if(tree[x]!=null&&tree[y]!=null){
                //两边数组都存在
                ArrayList<Double> temp = new ArrayList();
                for(int i=0;i<=tree[x].list.size()-1;i++){
                    if(!temp.contains(tree[x].list.get(i))){
                        //还没有就新加进来
                        temp.add(tree[x].list.get(i));
                    }
                }
                for(int i=0;i<=tree[y].list.size()-1;i++){
                    if(!temp.contains(tree[y].list.get(i))){
                        //还没有就新加进来
                        temp.add(tree[y].list.get(i));
                    }
                }
                //求和
                for(int i=0;i<=temp.size()-1;i++){
                    value += temp.get(i);
                }
                this.list = temp;
            }else if(tree[x]==null&&tree[y]!=null){
                value = tree[x].value;
                this.list = tree[x].list;
            }else if(tree[y]==null&&tree[x]!=null){
                value = tree[y].value;
                this.list = tree[y].list;
            }else{
                //System.out.println("??");
                value = 0;
                this.list = new ArrayList();
            }
            this.value = value;
        }
    }
    
    static void push(int root){
        tree[root] = new Node(2*root,2*root+1);
    }
    
    static void BuildTree(int l,int r,int root){
        if(l==r){
            tree[root] = new Node(input.nextDouble());
            return;
        }
        int m = (l+r)/2;
        BuildTree(l,m,2*root);
        BuildTree(m+1,r,2*root+1);
        push(root);
    }
    
    static void Query(int L,int R,int l,int r,int root){
        //是连续区间的话就给数组加内容
        if(l==1&&r==num){
            search = new ArrayList();
        }
        if(L<=l&&r<=R){
            if(tree[root]!=null)
            for(int i=0;i<=tree[root].list.size()-1;i++){
                if(!search.contains(tree[root].list.get(i))){
                    search.add(tree[root].list.get(i));
                }
            }
        return;
        }
        int m = (l+r)/2;
        if(L<=m)Query(L,R,l,m,2*root);
        if(R>m)Query(L,R,m+1,r,2*root+1);
    }
    
    public static void main(String[] args){
        int count = input.nextInt();
        for(int i=0;i<=count-1;i++){
            //Start...
            num = input.nextInt();
            tree = new Node[60001];
            BuildTree(1,num,1);
            int question = input.nextInt();
            for(int j=0;j<=question-1;j++){
                Query(input.nextInt(),input.nextInt(),1,num,1);
                //答案在search求和里面
                double res = 0;
                for(int k=0;k<=search.size()-1;k++){
                    res += search.get(k);
                }
                BigDecimal res2 = new BigDecimal(Double.toString(res));
                System.out.println(res2.stripTrailingZeros().toPlainString());
            }
            /*test
            for(int j=1;j<=2*num;j++){
                if(tree[j]!=null)
                System.out.println("test输入"+(i+1)+"tree["+j+"].value="+tree[j].value);
            }
*/
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值