VJ16216/RMQ/线段树

原创 2016年08月30日 13:15:41

题目链接

/*
单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减。
求[l,r]的和,用sum(r)-sum(l-1).即可。
*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long  LL;
const int maxn =500005;
int a[maxn];
int c[maxn];
char s[10];
int n,t;
void init()
{
    memset(c,0,sizeof(c));
}
int lowbit(int x)
{
    return x&(-x);
}
void add (int i,int v)
{
    while(i<=n)
    {
        c[i]+=v;
        i+=lowbit(i);
    }
}
int sum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=c[x];
        x-=lowbit(x);
    }
    return ret;
}
int main ()
{
    int T;scanf("%d",&T);
    int k=0;
    while(T--)
    {
        init();
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&t);
            add(i,t);
        }
        int l,r;
        printf("Case %d:\n",++k);
        while(true)
        {
            scanf("%s",s);
            if(s[0]=='Q')
            {
                scanf("%d%d",&l,&r);
                printf("%d\n",sum(r)-sum(l-1));
            }
            else if(s[0]=='S')
            {
                scanf("%d%d",&l,&r);
                add(l,-r);
            }
            else if(s[0]=='A')
            {
                scanf("%d%d",&l,&r);
                add(l,r);
            }
            else
                break;
        }
    }
    return 0;
}
/*
线段树的话就不说了,线段树处理单点更新的问题很好处理。
*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long  LL;
const int maxn =500005;
struct node
{
    int l;
    int r;
    int sum;
};
node f[maxn*3];
int a[maxn];
int n,T,k=0;
char s[10];
void build(int root,int l,int r)
{
    f[root].l=l;
    f[root].r=r;
    if(l==r)
        f[root].sum=a[l];
    else
    {
        int mid=(l+r)>>1;
        build(root<<1,l,mid);
        build(root<<1|1,mid+1,r);
        f[root].sum=(f[root<<1].sum+f[root<<1|1].sum);
    }
}
int query(int root,int l,int r)
{
    if(f[root].l==l&&f[root].r==r)
        return f[root].sum;
    int mid=(f[root].l+f[root].r)>>1;
    if(r<=mid)
        return query(root<<1, l, r);
    else if(l>=mid+1)
        return query(root<<1|1, l, r);
    else
        return query(root<<1, l, mid)+query(root<<1|1, mid+1, r);
}
void update(int root,int r,int v)
{
    if(f[root].r==f[root].l&&f[root].r==r)
    {
        f[root].sum+=v;
        return ;
    }
    f[root].sum+=v;
    int mid=(f[root].l+f[root].r)>>1;
    if(r<=mid)
        update(root<<1, r, v);
    else
        update(root<<1|1, r, v);
}
int main ()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        build(1,1,n);
        int l,r;
        printf("Case %d:\n",++k);
        while(true)
        {
            scanf("%s",s);
            if(s[0]=='E')
                break;
            else
            {
                scanf("%d%d",&l,&r);
                if(s[0]=='Q')
                    printf("%d\n",query(1, l, r));
                else if(s[0]=='A')
                    update(1, l, r);
                else if(s[0]=='S')
                    update(1, l, -r);
            }
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Balanced Lineup-POJ - 3264-RMQ线段树/st表

可以用RMQ线段树,或者st表 rmq线段树 建树 查询都是logn   支持更新元素  st表建树logn 查询o(1)!    不支持更新元素 以下是st表代码 #include #includ...
  • viphong
  • viphong
  • 2015年08月09日 00:04
  • 311

RMQ的ST写法和线段树写法两种姿势

RMQ问题为求区间最值的问题   线段树可以在O(logN)的时间复杂度内完成询问操作。 但是ST算法可以在常数时间内完成询问操作   ST算法:基于动态规划求区间最值的算法。 分为预处理...
  • u012350533
  • u012350533
  • 2013年11月09日 12:20
  • 1384

RMQ问题的线段树解法

RMQ(Range Minimum Query)问题是计算一个输入数列A[0...n-1]从位置i到位置j之间的最小值,即RMQ[i,j]=min{A[k], k=i,i+1...j}。RMQ的解法有...
  • ljsspace
  • ljsspace
  • 2011年08月02日 19:09
  • 2797

基于线段树的RMQ

const int maxn=1 int n; int dat[2&maxn-1]; void Init (int n_) {     n=1;     while(n     for(...
  • zhaiqiming2010
  • zhaiqiming2010
  • 2017年03月31日 17:44
  • 196

【BZOJ】【P3339&P3585】【Rmq Problem/mex】【题解】【离线】

传送门:www.lydsy.com/JudgeOnline/problem.php?id=3339 www.lydsy.com/JudgeOnline/problem.php?id=3585 ...
  • u012732945
  • u012732945
  • 2014年05月15日 23:43
  • 1590

zkw线段树解决区间rmq

zkw线段树具体内容请百度统计的力量(这是他讲的时候所用的ppt的名字)
  • u012513980
  • u012513980
  • 2014年05月22日 23:47
  • 2064

线段树和RMQ解析和模板

这几天在看RMQ的题目,但是很多RMQ的题目也可以用线段树解决。。。 看来两者...
  • Scythe666
  • Scythe666
  • 2014年07月30日 12:35
  • 933

poj3264 Balanced Lineup(RMQ裸题)

思路:熟悉RMQ的题目,求区间最大值减去最小值 #include #include #include using namespace std; const int maxn = 50000+100...
  • qq_21057881
  • qq_21057881
  • 2016年03月02日 15:38
  • 267

【数据结构与算法】RMQ+ST及线段树

昨天做了一道华为的机试题,关于RMQ。用了自己想的算法,无奈内存超了限制。 题目如下: 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年04月09日 15:27
  • 439

【BZOJ3339】Rmq Problem【离线】【线段树】【mex】

奇怪的线段树姿势get。 看了hzwer的题解,发现这个奇怪的姿势。 权值也是标记... /* Footprints In The Blood Soaked Snow */ #i...
  • BraketBN
  • BraketBN
  • 2016年03月08日 23:04
  • 256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VJ16216/RMQ/线段树
举报原因:
原因补充:

(最多只允许输入30个字)