这题跟ZOJ 3606的解题思路很相似。

题意:有3中操作:1.向集合中增加一个数x(1≤x≤1e9);2.从集合中删去一个数x(保证这个数存在);3.查询集合中所有位置满足i%5==3的数a[i]的和,集合中的数按升序排列。给你一共N个操作,输出每次查询的和。

做法:因为操作只有10^5个,所以将所有查询中的数保存下来,排序之后离散化。每个数对应一个“位置”,通过标记这个“位置”是否已用来表示该数是否在集合中。

线段树节点记录两个信息:

cnt:这一段“位置”中含有多少个数,pushUp的时候cnt[rt] = cnt[ rt << 1 ] + cnt[ rt << 1 | 1 ];

sum[5]:sum[i]表示这个区间中,从左到右编号,位置模5为i的所有数的和。

pushUp的时候,sum[rt][i] = sum[lc][i], sum[rt][ (i+cnt[lc])%5 ]+= sum[rc][i]

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define LL long long int
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define lc rt << 1
#define rc rt << 1 | 1 using namespace std; const int MAXN = ; struct Qry
{
int op;
int val;
} qq[MAXN]; struct node
{
LL sum[];
int cnt;
}; int Q;
int num[MAXN];
int cnt;
node Tr[ MAXN << ]; void build( int l, int r, int rt )
{
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = ;
Tr[rt].cnt = ; if ( l == r ) return;
int m = ( l + r ) >> ;
build( lson );
build( rson );
return;
} void PushUp( int rt )
{
Tr[rt].cnt = Tr[lc].cnt + Tr[rc].cnt;
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = Tr[lc].sum[i];
for ( int i = ; i < ; ++i ) Tr[rt].sum[ (i+Tr[lc].cnt)% ] += Tr[rc].sum[i];
return;
} void Update( int x, int op, int l, int r, int rt )
{
if ( l == x && x == r )
{
for ( int i = ; i < ; ++i ) Tr[rt].sum[i] = ;
if ( op == )
{
Tr[rt].cnt = ;
Tr[rt].sum[] = num[x];
}
else if ( op == ) Tr[rt].cnt = ;
return;
}
int m = ( l + r ) >> ;
if ( x <= m ) Update( x, op, lson );
else Update( x, op, rson );
PushUp( rt );
return;
} int main()
{
while ( scanf( "%d", &Q ) == )
{
cnt = ;
for ( int i = ; i < Q; ++i )
{
char tmp[];
scanf( "%s", tmp );
if ( tmp[] == 'a' )
{
qq[i].op = ;
scanf( "%d", &qq[i].val );
num[cnt++] = qq[i].val;
}
else if ( tmp[] == 'd' )
{
qq[i].op = ;
scanf( "%d", &qq[i].val );
num[cnt++] = qq[i].val;
}
else qq[i].op = ;
} sort( num + , num + cnt );
cnt = unique( num + , num + cnt ) - num;
build( , cnt - , ); for ( int i = ; i < Q; ++i )
{
if ( qq[i].op == )
printf( "%I64d\n", Tr[].sum[] );
else
{
int x = lower_bound( num + , num + cnt, qq[i].val ) - num;
Update( x, qq[i].op, , cnt - , );
}
}
}
return ;
}

HDU 4288 Coder ( 离散化 + 离线 + 线段树 )的更多相关文章

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

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

  2. HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...

  3. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  4. HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改

    题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...

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

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

  6. 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)

    求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...

  7. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. bzoj2333 离线 + 线段树

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

  9. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

随机推荐

  1. 怎么让Sublime Text不自动打开最近的文件/项目

    "hot_exit": false,"remember_open_files": false,

  2. block简介

    ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入 ...

  3. C#+Winform开发窗体程序

    学习笔记 第一章:winform基础 一.概述 1.Windows Form(简称WinForm) 是微软.NET平台下用于开发"图形界面"应用程序的组件. 2.C/S架构 客户机 ...

  4. Navicat-12.0.26的激活

    1.卸载掉早期版本,卸载干净,然后安装最新版Navicat(使用群文件中Iobit uninstaller8卸载) 2.安装完成后将破解补丁复制到安装目录下,运行破解补丁. 4.先patch,然后选择 ...

  5. ethereum(以太坊)(十三)--异常处理/元祖

    pragma solidity ^0.4.4; contract Students{ uint[] data= new uint[](4); address _owner = msg.sender; ...

  6. tcl之文件操作-文件名相关

  7. Allowed memory size of 134217728 bytes exhausted (tried to allocate 2 bytes)

    出现  Allowed memory size of 134217728 bytes exhausted (tried to allocate 2 bytes)时在php.ini文件中配置 memor ...

  8. python学习之列表和元组

    配置环境:python 3.6 python编辑器:pycharm,代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*- # list:是一种有序的集合,可以 ...

  9. python+scrapy环境搭建步骤描述

    Python3(3.5.4)搭建爬虫系统步骤描述: 1.下载python安装包,路径:https://www.python.org/downloads/windows/  选择3.5.4版本64位的安 ...

  10. SAP(ABAP):STOP,EXIT,CHECK,RETURN,REJECT,CONTINUE

    Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1. 当在INITIALIZAT ...