题目链接

/*
单点更新,用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;
}

VJ16216/RMQ/线段树单点更新的更多相关文章

  1. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  2. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  3. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  4. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  6. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

  7. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  8. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

随机推荐

  1. Graph Algorithm

    1.定义 A graph consists of a set of vertices V and a set of edges E. Each edge is a pair (v, w), where ...

  2. openwrt启动过程(脚本)

    来源:  http://wiki.openwrt.org/doc/techref/preinit_mount#first.boot 基本的openwrt启动顺序为: 1.boot loader loa ...

  3. OpenGL 茶壶

    void MyRenderer::Init_Teapot_VBO() { m_fun->glGenBuffers(, &m_teapot_vbo); m_fun->glBindBu ...

  4. Worker+MQ解惑

    用Worker来保证数据的一致性,再加上MQ来便于水平扩展,也提升了Worker的效率.这就是传说中的Worker+MQ,又叫做可靠消息方式.另外,将任务的查询和执行分工,形成父子任务,达到真正的分布 ...

  5. python 信用卡系统+购物商城见解

    通过完成信用卡系统+购物商城 使自己在利用 字典和列表方面有了较大的提升,感悟很深, 下面将我对此次作业所展示的重点列表如下: #!/usr/bin/env python3.5 # -*-coding ...

  6. C++对象模型笔记之程序设计模型

    C++程序设计模型支持三种程序设计模型 1.程序模型(procedural model) 可以理解为过程化模型,就像C一样 2.抽象数据类型模型(ADT) 数据结构教材里有说过,查了下资料也不是很明确 ...

  7. tomcat配置多个虚拟主机

    先修改默认端口(8080),http的默认端口是80,我们将8080改成80,这样域名就不用带上端口了 修改conf文件夹下的server.xml文件 添加多个主机(以下三个主机对应三个域名,三个域名 ...

  8. setting up a IPSEC/L2TP vpn on CentOS 6 or Red Hat Enterprise Linux 6 or Scientific Linux

    This is a guide on setting up a IPSEC/L2TP vpn on CentOS 6 or Red Hat Enterprise Linux 6 or Scientif ...

  9. Unlocker(强力删除文件工具) 1.9.2 汉化绿色版

    软件名称: Unlocker(强力删除文件工具) 1.9.2 汉化绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 5 ...

  10. RPC简介与Thrift框架

    RPC,全称是remote process call,远程过程调用,简单来讲就是调用部署在另一台服务器上的服务或者被部署在另一台服务器上的服务调用.由于各服务部署在不同机器,服务间的调用免不了网络通信 ...