题目大意:给一个数组a,他的顺序是严格的单调增,然后有如下三个操作

①加入一个val到a数组里面去,加入的位置就是a[i-1]<val<a[i+1]

②删除一个a[i]=val的值

③查询所有下标i%5=3的值

思路:线段树+离线

首先因为线段树中不支持添加、删除操作的,所以只能离线把所有的val离散化以后放到区间里面去。然后关键就是线段树是怎么建立的。

我们知道,每个%5都会有0,1,2,3,4这5个值,然后我们可以通过线段树来维护这5个值。我们首先用sum[5]表示能被5整除的5种求余后不同类型的数的val,然后再用cnt记录当前这个区间里面还存在的数值。接下来我们定义父亲区间,左子区间和右子区间,然后我们发现左子区间的区间范围和父亲区间的是一样的,然后右子区间的范围要发生改变,他的位置改变到如下位置:(i+cnt)%5,其中i表示右子区间的第几个区间,然后cnt表示左子区间的有效的个数。然后我们就这样去维护就好啦。

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxn = 1e5 + ;
struct point{
LL sum[];
int cnt;
void init(){
this -> cnt = ;
memset(sum, , sizeof(sum));
}
}tree[maxn << ];
LL a[maxn];
int q;
pair<char, LL> ch[maxn]; void buildtree(int o, int l, int r){
if (l == r){
tree[o].init();
return ;
}
int mid = (l + r) / ;
if (l <= mid) buildtree(o << , l, mid);
if (r > mid) buildtree(o << | , mid + , r);
tree[o].init();
} inline void push_up(int o){
tree[o].cnt = tree[o << ].cnt + tree[o << | ].cnt;
} void display(int o, int l, int r){
printf("o = %d l = %d r = %d\n", o, l, r);
for (int i = ; i < ; i++) printf("%d ", tree[o].sum[i]);
printf("\n");
} void update(int o, int l, int r, int pos, bool flag){
if (l == r && l == pos){
if (flag) {tree[o].sum[] += a[pos]; tree[o].cnt = ;}
else {tree[o].sum[] -= a[pos]; tree[o].cnt = ;}
return ;
}
int mid = (l + r) / ;
if (pos <= mid) update(o << , l, mid, pos, flag);
if (pos > mid) update(o << | , mid + , r, pos, flag);
memset(tree[o].sum, , sizeof(tree[o].sum));
for (int i = ; i < ; i++){
int j = (i + tree[o << ].cnt) % ;
tree[o].sum[i] += tree[o << ].sum[i];
tree[o].sum[j] += tree[o << | ].sum[i];
}
///display(o, l, r);
push_up(o);
return ;
} int main(){
while (scanf("%d", &q) == && q){
int n = ;
for (int i = ; i <= q; i++){
char s[]; LL tmp = -;
scanf("%s", s);
if (s[] == 'd' || s[] == 'a') scanf("%I64d", &tmp);
ch[i] = mk(s[], tmp);
if (s[] == 'a') a[++n] = tmp;
}
sort(a + , a + + n);///有待商榷
buildtree(, , n);
for (int i = ; i <= q; i++){
pair<char, LL> p = ch[i];
if (p.first == 's'){
printf("%I64d\n", tree[].sum[]);
continue;
}
else {
int pos = lower_bound(a + , a + + n, p.second) - a;
update(, , n, pos, p.first == 'a');
}
}
}
return ;
}

求余区间的求和类问题 离线+线段树 HDU4228的更多相关文章

  1. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  2. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  3. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  4. 区间第k大问题 权值线段树 hdu 5249

    先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...

  5. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  6. BZOJ 2333 棘手的操作(离线+线段树+带权并查集)

    这题搞了我一天啊...拍不出错原来是因为极限数据就RE了啊,竟然返回WA啊.我的线段树要开8倍才能过啊... 首先可以发现除了那个加边操作,其他的操作有点像线段树啊.如果我们把每次询问的联通块都放在一 ...

  7. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  8. 【树状数组区间修改区间求和】codevs 1082 线段树练习 3

    http://codevs.cn/problem/1082/ [AC] #include<bits/stdc++.h> using namespace std; typedef long ...

  9. UPC 2224 Boring Counting (离线线段树,统计区间[l,r]之间大小在[A,B]中的数的个数)

    题目链接:http://acm.upc.edu.cn/problem.php?id=2224 题意:给出n个数pi,和m个查询,每个查询给出l,r,a,b,让你求在区间l~r之间的pi的个数(A< ...

随机推荐

  1. HTML 概述

    一.hello world<!--根标签--><html> <!--头部--> <head> <!--标题标签--> <title&g ...

  2. 1.0 Python 学习网站

    w3cschool : http://www.runoob.com/python/python-tutorial.html cnblog Python 从入门到精通:  http://www.cnbl ...

  3. 慎用#define

    #define INT_MAX     2147483647 INT_MAX+1 就会变成负数 long long r; r > INT_MAX+1 就会出错,应该写成 r > 21474 ...

  4. webstoem自动编译less文件

    去node的主页下载对应版本的nodejs然后安装下载地址:http://nodejs.org/   根据自己的系统选择合适的版本下载. 安装完成之后打开命令提示符(win+r 输入cmd 回车),分 ...

  5. web.config中httpModules和Modules的区别

    最近用到了mvc的 Modules管道时,发现web.config中有两个modules 1.system.web节点下的httpModules 2.system.webServer节点下的modul ...

  6. BaLaBaLa

    #include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<a ...

  7. 框架基础:ajax设计方案(二)---集成轮询技术

      上一篇文章介绍了ajax技术核心方法,和跨域的问题(只要后台支持跨域默认post就可以),这篇文章讲解一下使用ajax实现的轮询技术,至于iframe,SSE服务器单向推送,以及webSocket ...

  8. Linux系统监控实用工具Glances

    Linux系统监控实用工具Glances Glances安装 Glances安装要求:python >= 2.6 和 psutil >= 0.4.1 1.第一步,安装了python-> ...

  9. Balancing Symbols

    symbols匹配问题 #include<iostream> #include<string> using namespace std; struct Node { char ...

  10. 15.找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}

    package com.bao; public class Erweim { public static void main(String[] args) { int[][]a={{3,2,6},{6 ...