当前位置: 首页 > news >正文

线段树(多棵) HDOJ 4288 Coder

 

题目传送门

题意:集合,add x, del x, 求和

分析:首先,暴力可以过这题。用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间合并右边的id‘ = i + leftnum,子节点要存到sum[o][1]表示%5=1。还需要对数据离线离散化。

//#include <bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <cstring>

#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
typedef long long ll;
const int N = 1e5 + 5;
ll sum[N<<2][5];
int cnt[N<<2];
int x[N], X[N];
char str[N][3];

void push_up(int o) {
    cnt[o] = cnt[o<<1] + cnt[o<<1|1];
    int lnum = cnt[o<<1];
    for (int i=0; i<5; ++i) {
        sum[o][i] = sum[o<<1][i];
    }
    for (int i=0; i<5; ++i) {
        sum[o][(i+lnum)%5] += sum[o<<1|1][i];
    }
}
void updata(int p, int op, int l, int r, int o) {
    if (l == r) {
        cnt[o] = op;
        sum[o][1] = op * X[l-1];
        return ;
    }
    int mid = l + r >> 1;
    if (p <= mid) {
        updata (p, op, lson);
    } else {
        updata (p, op, rson);
    }
    push_up (o);
}

int main() {
    int n, m;
    char str[N][3];
    while (scanf ("%d", &n) == 1) {
        m = 0;
        for (int i=0; i<n; ++i) {
            scanf ("%s", str[i]);
            if (str[i][0] != 's') {
                scanf ("%d", &x[i]);
                X[m++] = x[i];
            }
        }
        std::sort (X, X+m);
        m = std::unique (X, X+m) - X;
        memset (sum, 0, sizeof (sum));
        memset (cnt, 0, sizeof (cnt));
        for (int i=0; i<n; ++i) {
            int pos = std::upper_bound (X, X+m, x[i]) - X;
            if (str[i][0] == 'a') {
                updata (pos, 1, 1, m, 1);
            } else if (str[i][0] == 'd') {
                updata (pos, 0, 1, m, 1);
            } else {
                printf ("%I64d\n", sum[1][3]);
            }
        }
    }

    return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5316982.html

相关文章:

  • linux基础1
  • windons 安装ruby on rails
  • ChannelHandler adapters
  • 设置MySQL开机自动启动
  • [svc][op]关闭linux centos各种声音
  • unity3d倒计时后几秒改变颜色方法
  • js 多语言转换代码
  • HtmlUnit、httpclient、jsoup爬取网页信息并解析
  • 10个你可能没用过的Linux命令
  • 备案以及端口
  • gjrand 4.0.2 发布,伪随机数生成器
  • 必须掌握的八种排序(3-4)--简单选择排序,堆排序
  • 软件版本号 详解
  • AngularJS 过滤器(filter)
  • 置顶信息[置顶] 常用日常英语缩写
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CSS魔法堂:Absolute Positioning就这个样
  • es6要点
  • Git 使用集
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JWT究竟是什么呢?
  • scala基础语法(二)
  • VuePress 静态网站生成
  • 产品三维模型在线预览
  • 创建一种深思熟虑的文化
  • 诡异!React stopPropagation失灵
  • 前端之React实战:创建跨平台的项目架构
  • 如何胜任知名企业的商业数据分析师?
  • 小程序开发中的那些坑
  • 小试R空间处理新库sf
  • 译有关态射的一切
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # 达梦数据库知识点
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (动态规划)5. 最长回文子串 java解决
  • (二)斐波那契Fabonacci函数
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Unity3DUnity3D在android下调试
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *2 echo、printf、mkdir命令的应用
  • .Mobi域名介绍
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net MySql
  • .NET Project Open Day(2011.11.13)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net(C#)中String.Format如何使用
  • .Net(C#)自定义WinForm控件之小结篇