hdoj 1166 敌兵布阵

简介: 暴力超时,这道题可以用线段树做,因为更新的是单个节点,我们也可以用数组数组来做,我将两种方法的代码都给出 数组数组最适宜的用途就是区间求和和点的更新,但树状数组并不适用于区间的更新问题,也不是做不到,比较麻烦且难理解,有兴趣的可以看看这个

暴力超时,这道题可以用线段树做,因为更新的是单个节点,我们也可以用数组数组来做,我将两种方法的代码都给出


   数组数组最适宜的用途就是区间求和和点的更新,但树状数组并不适用于区间的更新问题,也不是做不到,比较麻烦且难理解,有兴趣的可以看看这个http://blog.csdn.net/xindoo/article/details/8748410

//树状数组
#include<stdio.h>
int n,ans[50005],f[50005];
int lowbit(int n)
{
    return n&(-n);
}
void add(int i,int v)
{
    while(i <= n)
    {
        ans[i] += v;
        i += lowbit(i);
    }
}
int query(int n)
{
    int s = 0;
    while(n)
    {
        s += ans[n];
        n -= lowbit(n);
    }
    return s;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int j = 1;j <= t; j++)
    {
        scanf("%d",&n);
        for(int l = 1; l <= n;l++)
        {
            scanf("%d",&f[l]);
            f[l] += f[l-1];
        }
        for(int l = 1; l <= n; l++)
            ans[l] = f[l]-f[l-lowbit(l)];
        printf("Case %d:\n",j);
        while(1)
        {
            char s[20];
            int a,b;
            scanf("%s",s);
            if (s[0] == 'E') break;
            scanf("%d%d",&a,&b);
            if (s[0] == 'A') add(a,b);
            if (s[0] == 'S') add(a,-b);
            if (s[0] == 'Q') printf("%d\n",query(b)-query(a-1));
        }
    }
    return 0;
}
//线段树解法
#include <stdio.h>
#include <string.h>
#define maxn 50005
struct node
{
    int l, r, m;
    int sum;
}tree[maxn<<2];
int a[maxn];
void build(int l, int r, int o)
{
    tree[o].l = l;
    tree[o].r = r;
    int m = (l+r)>>1;
    tree[o].m = m;
    if (l == r)
    {
        tree[o].sum = a[l];
        return;
    }
    build(l, m, o<<1);
    build(m+1, r, (o<<1)+1);
    tree[o].sum = tree[o<<1].sum + tree[(o<<1)+1].sum;
 }
void update(int l, int v, int o)
{
    tree[o].sum += v;
    if (tree[o].l == l && tree[o].r == l)
        return;
    if (l <= tree[o].m)
        update(l, v, o<<1);
    else
        update(l, v, (o<<1)+1);
}
int query(int l, int r, int o)
{
    if (tree[o].l == r && tree[o].r == r)
        return tree[o].sum;
    if (tree[o].m >= r)
        return query(l, r, o<<1);
    else if (tree[o].m <l)
        return query(l, r, (o<<1)+1);
    else
        return query(l, tree[o].m, o<<1) + query(tree[o].m+1, r, (o<<1)+1);
}
int main()
{
    int t, n;
    scanf("%d",&t);
    for (int j = 1; j <= t; j++)
    {
        scanf("%d",&n);
        for (int i = 1; i <= n; i++)
            scanf("%d",&a[i]);
        build(1, n, 1);
        printf("Case %d:\n",j);
        while(1)
        {
            char s[20];
            int l, r;
            scanf("%s",s);
            if (s[0] == 'E')
                break;
            scanf("%d%d",&l,&r);
            if (s[0] == 'A')
                update(l, r, 1);
            else if (s[0] == 'S')
                update(l, -r, 1);
            if (s[0] == 'Q')
                printf("%d\n",query(l, r, 1));
        }
    }
    return 0;
}
目录
相关文章
|
传感器 物联网 数据安全/隐私保护
低功耗蓝牙和 Wi-Fi 相比有什么优缺点
低功耗蓝牙(BLE)与Wi-Fi相比,功耗更低、成本更少,适用于短距离、小数据量传输,如智能手环等;但传输速度和距离不如Wi-Fi,适合对实时性和带宽要求不高的场景。
|
Go
Golang语言数据类型分类及进制转换案例
这篇文章详细介绍了Go语言中数据类型的分类、进制转换的概念和实例,以及数字字面量语法,还涉及了原码、反码和补码的相关知识。
148 0
Golang语言数据类型分类及进制转换案例
|
机器学习/深度学习 传感器 自动驾驶
视觉BEV基本原理和方案解析
视觉BEV在高德高精地图地面要素识别、车道线拓扑构建、车端融合定位等业务场景中都扮演了重要角色。
PullToRefresh的简单使用
PullToRefresh的简单使用
312 1
|
Python
如何在Python 查找两个列表之间的差异?
如何在Python 查找两个列表之间的差异?
600 0
|
机器学习/深度学习 数据可视化 大数据
【钉钉杯大学生大数据挑战赛】初赛 A:银行卡电信诈骗危险预测 Baseline
本文介绍了参加"钉钉杯大学生大数据挑战赛"初赛A的银行卡电信诈骗危险预测项目的Baseline方案,包括问题分析、Python实现(含数据探索、模型训练调参、特征工程、模型评价和可视化)、以及代码下载链接。
324 0
|
数据可视化 Python
DataFrame 中的时间序列分析:处理日期和时间数据
【5月更文挑战第19天】在数据分析中,时间序列数据的处理至关重要。使用Pandas,我们可以将日期列转换为日期类型,便于进行时间序列操作,如提取年月日、计算时间间隔。通过`resample`处理不规则间隔,用`fillna`或`dropna`填补或删除缺失日期。结合`matplotlib`进行可视化,揭示数据趋势。正确处理日期和时间信息是准确分析的前提,帮助我们从时间序列数据中发现模式,为决策提供依据。
533 2
|
机器学习/深度学习 算法 数据挖掘
【机器学习】包裹式特征选择之递归特征添加法
【机器学习】包裹式特征选择之递归特征添加法
425 5
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
3845 0
|
XML JSON 中间件
Go 框架 iris 文档(一)
Go 框架 iris 文档(一)
558 0