题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4288

题目大意:

维护一个有序数列{An},有三种操作:

1、添加一个元素。

2、删除一个元素。

3、求数列中下标%5 = 3的值的和

解题思路:

线段树不支持动态的添加,删除操作,所以本题用了离线处理,将所有数字事先离散化,给每个数字存一个位子,然后处理。

先离线把要用到的数离散化,去重并且排序,这样做添加或删除操作的时候就可以用二分找出下表并在线段树内修改,由于是单点更新,就不用”向下传递“了。

其实操作和单点更新一样,只是要用一个数组sum[5]记录对应区间内mod5的5种情况的和。所以当添加或删除一个数时都是在sum[1]这里增删,可以想想区间[2,2]是不是只有一个数,那么这个数的下标是1,mod5=1,所以在sum[1]处处理,更新父节点的时候要注意,父亲的左区间的下标与左儿子的下标mod5的情况完全相同,而父亲的右区间和右儿子的下标在左儿子的个数前提上mod5,所以cnt代表区间内有效数的个数。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MID(l, r) (l + (r - l) / 2)
#define lson(o) (o * 2)
#define rson(o) (o * 2 + 1)
using namespace std;
typedef long long ll;
const int INF = 1e9 +;
const int maxn = 1e6 + ;
int h, w, n;
struct node
{
int l, r, tot;//tot表示节点个数
ll sum[];
}tree[maxn];
void build(int o, int l, int r)
{
tree[o].l = l, tree[o].r = r;
tree[o].tot = ;
memset(tree[o].sum, , sizeof(tree[o].sum));
if(l == r)
{
return;
}
int m = MID(l ,r), lc = lson(o), rc = rson(o);
build(lc, l, m);
build(rc, m + , r);
}
//a[p] += v * x
//v表示符号,为1表示add 为-1表示del
int p, v, x;
void update(int o)
{
if(tree[o].l == tree[o].r)
{
tree[o].sum[] += v * x;
tree[o].tot += v;
return ;
}
int lc = lson(o), rc = rson(o);
if(p <= tree[lc].r)update(lc);
else update(rc);
for(int i = ; i < ; i++)
tree[o].sum[i] = tree[lc].sum[i] + tree[rc].sum[((i - tree[lc].tot) % + ) % ];
tree[o].tot = tree[lc].tot + tree[rc].tot;
} int a[maxn], b[maxn], c[maxn];
int main()
{
while(scanf("%d", &n) != EOF)
{
char s[];
int tot = ;
for(int i = ; i < n; i++)
{
scanf("%s", s);
if(s[] == 's')
a[i] = ;
else
{
scanf("%d", &b[++tot]);
if(s[] == 'a')
a[i] = ;
else a[i] = ;
}
}
memcpy(c, b, sizeof(c));
sort(b + , b + tot + );
tot = unique(b + , b + tot + ) - (b + );
build(, , tot);
for(int i = , j = ; i < n; i++)
{
if(a[i] == )
{
printf("%lld\n", tree[].sum[]);
}
else
{
if(a[i] == )v = ;
else v = -;
p = lower_bound(b + , b + + tot, c[++j]) - b;
x = b[p];
update();
}
}
}
return ;
}

hdu-4288 Coder---线段树+离线处理&离散化的更多相关文章

  1. hdu 4288 Coder (线段树+离线)

    题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出.       digest sum求 ...

  2. HDU 4288 Coder(线段树)

    题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x  删除序列中值为x的元素 3. sum  求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...

  3. HDU 4288 Coder 【线段树+离线处理+离散化】

    题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...

  4. HDU 4638-Group(线段树+离线处理)

    题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...

  5. HDU 4417 【线段树+离线处理】

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...

  6. HDU 3333 & 3874 (线段树+离线询问)

    两个题目都是求区间之内,不重复的数字之和,3333需要离散化处理................. 调试了一下午........说多了都是泪........... #include <iostr ...

  7. HDU - 3874 Necklace (线段树 + 离线处理)

    欢迎參加--每周六晚的BestCoder(有米! ) Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/3 ...

  8. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  9. POJ-2528 Mayor's posters (线段树区间更新+离散化)

    题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...

  10. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

随机推荐

  1. PIE SDK矢量数据编辑的撤销和回退

    1.功能简介 在数据的编辑过程中难免会出现失误,撤销和回退可以更好的编辑,下面对矢量数据编辑的撤销和回退功能进行介绍. 2.功能实现说明 2.1. 实现思路及原理说明 第一步 调用UndoComman ...

  2. Farey Sequence(欧拉函数板子题)

    题目链接:http://poj.org/problem?id=2478 Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. js栈内存和堆内存的区别

    首先JavaScript中的变量分为基本类型和引用类型.基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象. 1.基本类型 基本类型有Undefined.Null.Boo ...

  4. URL篇之相对URL

    URL有两种方式:绝对的和相对的. 绝对URL中包含有访问资源所需的全部信息,是访问网络资源必须的. 相对URL是不完整的,要从相对URL中获取访问资源所需的全部信息,就必须相对于另一个被称为其基础( ...

  5. DB Intro - MongoDB Relations

    https://www.quackit.com/mongodb/tutorial/mongodb_create_a_relationship.cfm

  6. (转)Linux基础------Shell数值计算的几种方法

    Linux基础------Shell数值计算的几种方法 原文:http://blog.csdn.net/fu_wayne/article/details/21620639 在Linux下总会遇到数值计 ...

  7. nginx禁止对写操作timeout时retry

    1) nginx禁止对写操作timeout时retry 以前遇到的一个case,业务那边说一笔请求从nginx端发送给后端tomcat了2次(落在两个不同的tomcat节点上).后来发现是nginx发 ...

  8. View视图调用控制器方法

    1.@using XXX.Controllers;//引用控制器 2. var otherController = DependencyResolver.Current.GetService<U ...

  9. XML入门介绍(什么是XML及XML格式)

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标记语言. XML 的设计宗旨是传输数据,而不是显示数据. XML 标 ...

  10. MongoDB学习之mongoose

    MongoDB介绍: MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换 ...