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

開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设删除第三个数,就将3,6的位置全+1,就是向右偏移以为,可是求和还是非常慢,所以即使10秒,还是TLE。。。

正确做法:

1、节点内维护sum[0...4]分别代表区间内%5==i的和

2、结点维护点的个数,cnt

3、离散化处理,然后每次插入时,经过的结点cnt+1或-1,叶子节点Sum[0]就是节点值,父节点的sum这样维护了:非常不错的方法

void pushup(int rt)
{
for(int i=0;i<5;i++)
nodes[rt].sum[i]=nodes[ls(rt)].sum[i]+nodes[rs(rt)].sum[ ((i-nodes[ls(rt)].cnt)%5+5)%5 ];
}

4、离散化+离线,能够使删除数比較方便,不用map

新学会的离散化方法:

for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
tmp[num++]=a[i];
}
sort(tmp,tmp+num);
num=unique(tmp,tmp+num)-tmp;
//然后能够这样查询位置
int pos=lower_bound(tmp,tmp+num,a[i])-tmp;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
#define IN(s) freopen(s,"r",stdin)
#define CL(a,b) memset(a,b,sizeof(a))
#define ll long long
#define ls(rt) rt*2
#define rs(rt) rt*2+1
const int MAXN = 1e5+100; struct Node{
int l,r;
ll sum[5]; //
int cnt; //区间内数的个数
}nodes[MAXN*4]; int a[MAXN],n,tmp[MAXN];
char op[MAXN][6]; void build(int rt,int l,int r)
{
nodes[rt].l=l;
nodes[rt].r=r;
nodes[rt].cnt=0;
CL(nodes[rt].sum,0);
if(l==r)return;
int mid=(l+r)/2;
build(ls(rt),l,mid);
build(rs(rt),mid+1,r);
} void pushup(int rt)
{
for(int i=0;i<5;i++)
nodes[rt].sum[i]=nodes[ls(rt)].sum[i]+nodes[rs(rt)].sum[ ((i-nodes[ls(rt)].cnt)%5+5)%5 ];
} void update(int rt, int pos, int d, int flag)
{
nodes[rt].cnt+=flag;
if(nodes[rt].l == nodes[rt].r)
{
nodes[rt].sum[0]+=d;
return;
}
if(pos<=nodes[ls(rt)].r)update(ls(rt),pos,d,flag);
else update(rs(rt),pos,d,flag);
pushup(rt);
} int main()
{
//IN("hdu4288.txt");
int num;
while(~scanf("%d",&n))
{
num=0;
for(int i=0;i<n;i++)
{
scanf("%s",op[i]);
if(op[i][0]!='s')
{
scanf("%d",&a[i]);
tmp[num++]=a[i];
}
}
sort(tmp,tmp+num);
num=unique(tmp,tmp+num)-tmp;
build(1,1,num);
for(int i=0;i<n;i++)
{
int pos=lower_bound(tmp,tmp+num,a[i])-tmp;
if(op[i][0] == 'a')update(1,pos,a[i],1);
if(op[i][0] == 'd')update(1,pos,-a[i],-1);
if(op[i][0] == 's')printf("%I64d\n",nodes[1].sum[2]);
}
}
return 0;
}

hdu 4288 线段树+离线+离散化的更多相关文章

  1. 玲珑oj 1117 线段树+离线+离散化,laz大法

    1117 - RE:从零开始的异世界生活 Time Limit:1s Memory Limit:256MByte Submissions:438Solved:68 DESCRIPTION 486到了异 ...

  2. hdu 4288 线段树 暴力 **

    题意: 维护一个有序数列{An},有三种操作: 1.添加一个元素. 2.删除一个元素. 3.求数列中下标%5 = 3的值的和. 解题思路: 看的各种题解,今天终于弄懂了. 由于线段树中不支持添加.删除 ...

  3. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  4. HDU 3607 线段树+DP+离散化

    题意:从左往右跳箱子,每个箱子有金币数量,只能从矮处向高处跳,求最大可获得金币数,数据规模1<=n<=1e5. 显然是一个dp的问题,不难得出dp[ i ] = max(dp[j] )+v ...

  5. J - Super Mario HDU - 4417 线段树 离线处理 区间排序

    J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...

  6. HDU 4288 线段树+离散化

    题意: n个操作 在[1, 100000]  的区间上add 或del数( 必不会重复添加或删除不存在的数) sum 求出整个集合中 (下标%5 == 3 位置) 的数   的和 注意数据类型要64位 ...

  7. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  8. HDU 1542 线段树+扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  9. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. 05006_Linux的jdk、mysql、tomcat安装

    1.软件包下载链接:软件包下载 密码:advk 2.安装JDK (1)查看当前Linux系统是否已经安装java,输入 rpm -qa | grep java : (2)卸载两个openJDK (3) ...

  2. Java Web学习总结(26)——Servlet不同版本之间的区别

    1.   2.3版本 2.3版本 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2. ...

  3. [terry笔记]python购物程序

    如下是一个购物程序: 先输入工资,显示商品列表,购买,quit退出,最后格式化输出所买的商品. count = 0 while True: #做一个循环判断,如果输入的不是数字,基于提示,三次后退出 ...

  4. a.WHERE使用中单行子查询(适用于>,<,=,>=,<=等条件)

    a.单行子查询(适用于>,<,=,>=,<=等条件)    //查询工资最高的员工编号和员工名   select empno,ename   from emp   where ...

  5. GROUP BY 与聚合函数 使用注意点

    表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...

  6. SQL SERVER-集合操作

    内连接      INNER JOIN(等值连接):只显示两个表中联结字段相等的行.这个和用select查询多表是一样的效果,所以很少用到:外连接:LEFT JOIN :以左表为基础,显示左表中的所有 ...

  7. 译:MySQL性能优化的21条最佳经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  8. Xamarin部署时遇到错误: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]

    1 把adb命令加入到环境变量. ADB 的位置:C:\Users\USER\AppData\Local\Android\android-sdk\platform-tools 2. 卸载包,执行(是a ...

  9. 数据库中的java.sql.Timestamp转换成Date

    查询数据库中的时间类型为 java.sql.Timestamp 保存在json中需要格式化 自定义工具类  DateJsonValueProcessor package com.rom.util; i ...

  10. bzoj1293: [SCOI2009]生日礼物(stl堆)

    1293: [SCOI2009]生日礼物 题目:传送门 题解: 据说这道题乱搞随便就水过了 本蒟蒻想到了一个用堆的水法(还专门学了学queue): 如果把每一种颜色的下一个位置都记录一下的话,一开始就 ...