hdu-4288 Coder---线段树+离线处理&离散化
题目链接:
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---线段树+离线处理&离散化的更多相关文章
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- HDU 4288 Coder(线段树)
题意: 给定三种操作 1. add x 向序列中添加x,添加之后序列还保持有序 2. del x 删除序列中值为x的元素 3. sum 求下边模5等于3的元素和 思路: 直接暴力也可以过,就是看暴 ...
- HDU 4288 Coder 【线段树+离线处理+离散化】
题意略. 离线处理,离散化.然后就是简单的线段树了.需要根据mod 5的值来维护.具体看代码了. /* 线段树+离散化+离线处理 */ #include <cstdio> #include ...
- HDU 4638-Group(线段树+离线处理)
题意: 给n个编号,m个查询每个查询l,r,求下标区间[l,r]中能分成标号连续的组数(一组内的标号是连续的) 分析: 我们认为初始,每个标号为一个组(线段树维护区间组数),从左向右扫序列,当前标号, ...
- HDU 4417 【线段树+离线处理】
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:找出给定区间内,有多少个数小于等于给定的数.用线段树维护的话会超时,要用到线段树的离线操作,对询问与 ...
- HDU 3333 & 3874 (线段树+离线询问)
两个题目都是求区间之内,不重复的数字之和,3333需要离散化处理................. 调试了一下午........说多了都是泪........... #include <iostr ...
- HDU - 3874 Necklace (线段树 + 离线处理)
欢迎參加--每周六晚的BestCoder(有米! ) Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/3 ...
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
随机推荐
- Notepad++ 代码格式化插件
UniversalIndentGUI 是一个代码格式化工具合集,基于很多开源的代码格式化项目.有NPP的插件版也有独立的程序,支持常见代码格式. 支持的代码格式: C, C++, C#, Cobol, ...
- jmeter+ant+jenkins生产的报告乱码
jmeter+ant+jenkins生产的报告乱码 问题:生产报告会乱码的问题,一般是有编码格式引起的.我遇到的问题是,jmeter需要读取csv的数据作为参数.但是我们并不知道csv保存是什么编码格 ...
- BENZ Prognosis System C5 SD Be connected & Panasonic Xentry-Tab
Brand-new released!! Recently, we all autonumen website gives a brand-new Superstar prognosis bundle ...
- vue filters过滤器的使用
说的很详细 https://www.w3cplus.com/vue/how-to-create-filters-in-vuejs.html
- fixed
之前我们见的fixed就是固定在低端.后来我遇到一个问题 如果 这样写: div{ position: fixed; left: 0; bottom: 0; } 内容吧div撑开,有多少算多少 di ...
- oracle 集群RAC搭建(四)--grid部署
安装教程:
- oracle 基础知识(二)-表空间
一,表空间 01,表空间? Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表.有了数据库,就可以创建表空间.表空间(tablespace)是数据库 ...
- DP Intro - Tree DP
二叉苹果树 题目 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点 ...
- LeetCode 200.岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...
- apache CXF quickstart
1下载 官网: cxf.apache.org 下载 CXF 的开发包: 解压上面的 zip 文件 : 2介绍 1什么是cxf Apache CXF™ is an open source service ...