zoukankan      html  css  js  c++  java
  • hdu1166 敌兵布阵 线段树

    TLE求错误啊啊啊啊啊啊啊

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <cmath>
    #include <cstring>
    
    using namespace std;
    
    #define MAXN 50010
    
    int ai[MAXN];
    int N;
    int T;
    
    struct node
    {
        int left;
        int right;
        int sum;
    }Tree[MAXN<<2];
    
    void PushUp(int root)
    {
        Tree[root].sum = Tree[root<<1].sum + Tree[(root<<1)+1].sum;
    }
    
    void Build(int start,int end,int root)
    {
        Tree[root].left = start;
        Tree[root].right = end;
        int mid = (start + end)>>1;
        if(start == end)
        {
            Tree[root].sum = ai[start];
            return;
        }
        Tree[root].left = start;
        Tree[root].right = end;
        Build(start,mid,root*2);
        Build(mid+1,end,root*2+1);
        PushUp(root);
        //Tree[root].sum = Tree[root<<1].sum + Tree[(root<<1)+1].sum;
    }
    
    int Query(int start,int end,int root)
    {
        if(start > Tree[root].right || end < Tree[root].left)
            return 0;
        if(start<= Tree[root].left && Tree[root].right <= end)
            return Tree[root].sum;
        int mid = (start + end)>>1;
        int a = Query(start,end,root<<1);
        int b = Query(start,end,(root<<1)+1);
        return a+b;
    }
    
    void Update(int root,int pos,int value,int start,int end,int type)
    {
        if(start == end)
        {
            if(type == 1)
                Tree[root].sum += value;
            if(type == 2)
                Tree[root].sum -= value;
            return;
        }
        int mid = (start + end)>>1;
        if(pos <= mid)
            Update(root<<1,pos,value,start,mid,type);
        else
            Update((root<<1)+1,pos,value,mid+1,end,type);
        PushUp(root);
    }
    
    
        
    int main()
    {
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
        scanf("%d",&T);
        int count = 0;
        while(T--)
        {
            memset(ai,0,sizeof(ai));
            memset(Tree,0,sizeof(Tree));
            count++;
            scanf("%d",&N);
            for(int i = 1; i <= N; i++)
            {
                scanf("%d",&ai[i]);
            }
            Build(1,N,1);
            cout<<"Case "<<count<<":"<<endl;
            char oper[11];
            int i,j;
            while(scanf("%s",oper))
            {
                if(strcmp(oper,"End")==0)
                    break;
                cin>>i>>j;
                if(strcmp(oper,"Query")==0)
                    cout<<Query(i,j,1)<<endl;
                if(strcmp(oper,"Add")==0)
                {
                    ai[i] += j;
                    Update(1,i,j,1,N,1);
                }
                if(strcmp(oper,"Sub")==0)
                {
                    ai[i] -= j;
                    Update(1,i,j,1,N,2);
                }
            }
        }
        return 0;
    }
    


  • 相关阅读:
    将数组转换为 List, 使用 Collections.addAll(arrayList, array)
    Numpy学习笔记
    sql 批量修改字段内容
    sql 查询的优化
    选择低薪喜欢的工作, 还是高薪不喜欢的工作 ?
    Tornado + Bootstrap 快速搭建自己的web应用
    sql查询出现次数最多的记录的名称和现次数以及QT聚合查找失败解决
    idea中修改git提交代码的用户名
    初识Spring Cloud与微服务
    微信小程序解析富文本的几种方法
  • 原文地址:https://www.cnblogs.com/pangblog/p/3243834.html
Copyright © 2011-2022 走看看