zoukankan      html  css  js  c++  java
  • 线段树!

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int N = 10001;
    
    int a[N];
    int tree[N*2];
    
    build_tree(int a[],int tree[],int node,int start,int end1)
    {
        if(start == end1)
        {
            tree[node] = a[start];
        }
        else{
        int mid = (start+end1)/2;
        int left_node = 2*node+1;
        int right_node = 2*node+2;
        build_tree(a,tree,left_node,start,mid);
        build_tree(a,tree,right_node,mid+1,end1);
        tree[node] = tree[left_node] + tree[right_node];
        }
    }
    up_data(int a[],int tree[],int node,int start,int end1,int idx,int val)
    {
        if(start == end1)
        {
            a[idx] = val;
            tree[node] = val;
        }
        else
        {
            int mid = (start+end1)/2;
            int left_node = 2*node+1;
            int right_node = 2*node+2;
            if(idx >= start&&idx<=mid)
            {
                up_data(a,tree,left_node,start,mid,idx,val);
            }
            else
            {
                up_data(a,tree,right_node,mid+1,end1,idx,val);
            }
            tree[node] = tree[left_node] + tree[right_node];
        }
    }
    int query_data(int a[],int tree[],int node, int start, int end1 ,int l ,int r)
    {
        if(l>end1||r<start)
        {
            return 0;
        }
        else if(start == end1)
        {
            return tree[node];
        }
        else if(start>=l&&end1<=r)
        {
            return tree[node];
        }
        else
        {
            int mid = (start+end1)/2;
            int left_node  = 2*node+1;
            int right_node = 2*node+2;
            int sum_left  = query_data(a,tree,left_node,start,mid,l,r);
            int sum_right = query_data(a,tree,right_node,mid+1,end1,l,r);
            return sum_left+sum_right;
        }
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        build_tree(a,tree,0,0,n-1);
        for(int i = 0;i<14;i++)
        {
            cout<<tree[i]<<endl;
        }
        up_data(a,tree,0,0,n-1,4,6);
        for(int i = 0;i<14;i++)
        {
            cout<<tree[i]<<endl;
        }
        cout<<query_data(a,tree,0,0,n-1,3,5)<<endl;
        return 0;
    }
  • 相关阅读:
    使用HttpClient发送请求、接收响应
    jdbc操作
    数据库通用Jdbc操作
    将WSDL文件生成的Java文件
    数据结构_线性表_链表实现
    15年第六届蓝桥杯第七题_手链样式_(stl_string)
    16年第七届蓝桥杯第九题_密码脱落_(贪心)
    16年第七届蓝桥杯第七题_剪邮票
    16年第七届蓝桥杯第三题_方格填数
    Codeforces_789C_(dp)
  • 原文地址:https://www.cnblogs.com/zyz010206/p/12590652.html
Copyright © 2011-2022 走看看