• 敌兵布阵-HDU1166 点修改+区间查询


    题目:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1166
    中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.

    思路:基本的线段树点修改+区间查询

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=5e4+5;
    int tree[MAXN<<2];
    void push_up(int node)//向上传递的函数,易知一个区间和等于他的两个子区间之和
    {
        tree[node]=tree[node<<1]+tree[node<<1|1];
    }
    void build(int node,int l,int r)//递归建树
    {
        if(l==r)
        {
            cin>>tree[node];
            return ;
        }
        int mid=(l+r)>>1;
        build(node<<1,l,mid);
        build(node<<1|1,mid+1,r);
        push_up(node);
    }
    void update(int node,int l,int r,int k,int i)//点修改
    {
        int mid=(l+r)>>1;
        if(l==r)
        {
            tree[node]+=k;return;
        }
        if(i<=mid)
            update(node<<1,l,mid,k,i);
        else
            update(node<<1|1,mid+1,r,k,i);
        push_up(node);
    }
    int query(int node,int l,int r,int L,int R)//区间查询
    {
        if(L<=l&&R>=r)
        {
            return tree[node];
        }
        int mid=(l+r)>>1;
        int ans=0;
        if(L<=mid)
            ans+=query(node<<1,l,mid,L,R);
        if(R>mid)
            ans+=query(node<<1|1,mid+1,r,L,R);
        return ans;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t;cin>>t;int case_=0;
        while(t--)
        {
            cout<<"Case "<<++case_<<":"<<endl;
            int n;cin>>n;
            build(1,1,n);
            while(1)
            {
                string s;
                cin>>s;
                if(s=="Query")
                {
                    int x,y;cin>>x>>y;
                    cout<<query(1,1,n,x,y)<<endl;
                }
                else
                    if(s=="Add")
                {
                    int x,y;cin>>x>>y;
                    update(1,1,n,y,x);
                }
                else
                    if(s=="Sub")
                {
                    int x,y;cin>>x>>y;
                    update(1,1,n,-y,x);
                }
                else
                {
                    break;
                }
    
            }
        }
        return 0;
    }
  • 相关阅读:
    LR-Controller 如何自定义显示虚拟用户状态
    Jmeter Md5加密操作之-------BeanShell PreProcessor
    [编译器]dev c++单步调试
    [数据结构]二叉树创建与遍历
    [数分笔记]关于有限覆盖定理
    [数分笔记]用Dedekind切割定理证明确界定理
    [数分笔记]Dedekind切割定理的证明
    [思考的乐趣] 有趣的莫比乌斯带
    [转自Matrix67] 趣题:顶点数为多少的图有可能和自己互补
    [数分笔记]问题1.1 T1
  • 原文地址:https://www.cnblogs.com/ljxdtc666/p/12222769.html
Copyright © 2020-2023  润新知