Codeforces 85D Sum of Medians(线段树)[通俗易懂]

Codeforces 85D Sum of Medians(线段树)

大家好,又见面了,我是全栈君。

题目链接:Codeforces 85D – Sum of Medians

题目大意:N个操作,add x:向集合中加入x;del x:删除集合中的x;sum:将集合排序后,将集合中全部下标i % 5 = 3的元素累加求和。

解题思路:线段树单点更新,每一个点维护5个值。分别表示从该段区间中i % 5 = t的和。然后两端区间合并时仅仅须要依据左孩子中元素的个数合并。所以有一个c表示区间上元素的个数。

由于有同样的数。所以要离线操做,将全部的数映射成位置,可是对于del则不须要映射,由于集合中肯定有才干减掉。那么add和sum操作都是能够搞定了,仅仅剩下del操作,对于del x,x肯定在集合中出现过。所以每次删除第一个x就可以,假设高速查找,要借助map和一个辅助数组,由于删除一个后要又一次映射,所以借助辅助数组。

#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;
const int mod = 5;
const int maxn = 1e5+5;

int N, M, pos[maxn], v[maxn];
map<ll, int> G;

#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
int lc[maxn << 2], rc[maxn << 2], c[maxn << 2];
ll s[maxn << 2][6];

inline void maintain (int u, int d) {
    c[u] += d;
    memset(s[u], 0, sizeof(s[u]));
    s[u][0] = (c[u] ? pos[lc[u]] : 0);
}

inline void pushup(int u) {
    int t = c[lson(u)] % mod;
    c[u] = c[lson(u)] + c[rson(u)];
    for (int i = 0; i < mod; i++)
        s[u][i] = s[lson(u)][i] + s[rson(u)][(i + mod - t) % mod];
}

void build (int u, int l, int r) {
    lc[u] = l;
    rc[u] = r;
    c[u] = 0;
    memset(s[u], 0, sizeof(s[u]));

    if (l == r)
        return;
    int mid = (l + r) / 2;
    build(lson(u), l, mid);
    build(rson(u), mid + 1, r);
    pushup(u);
}

void modify (int u, int x, int d) {
    if (lc[u] == x && rc[u] == x) {
        maintain(u, d);
        return;
    }

    int mid = (lc[u] + rc[u]) / 2;
    if (x <= mid)
        modify(lson(u), x, d);
    else
        modify(rson(u), x, d);
    pushup(u);
}

struct OP {
    int p, k, id;
    OP (int k = 0, int p = 0, int id = 0) {
        this->k = k;
        this->p = p;
        this->id = id;
    }
    friend bool operator < (const OP& a, const OP& b) {
        if (a.k == 0)
            return false;
        if (b.k == 0)
            return true;
        if (a.p != b.p)
            return a.p < b.p;
        return a.id < b.id;
    }
};

inline bool cmp (const OP& a, const OP& b) {
    return a.id < b.id;
}

vector<OP> vec;

void init () {
    scanf("%d", &N);
    char op[5];
    int x;

    for (int i = 1; i <= N; i++) {
        scanf("%s", op);
        if (op[0] == 's')
            vec.push_back(OP(0, 0, i));
        else {
            scanf("%d", &x);
            vec.push_back(OP(op[0] == 'a' ? 1 : -1, x, i));
        }
    }

    M = 1;
    sort(vec.begin(), vec.end());
    for (int i = 0; i < N; i++) {
        if (vec[i].k < 0)
            continue;
        if (vec[i].k == 0)
            break;

        pos[M] = vec[i].p;
        vec[i].p = M++;
    }
    build(1, 1, M);
}

void solve () {
    sort(vec.begin(), vec.end(), cmp);
    for (int i = 0; i < N; i++) {
        //printf("%d %d!\n", vec[i].k, pos[vec[i].p]);
        if (vec[i].k == 0)
            printf("%lld\n", s[1][2]);
        else if (vec[i].k == -1) {
            int tmp = vec[i].p;
            v[G[tmp]] = 0;
            modify(1, G[tmp], -1);

            if (G[tmp] <= N && v[G[tmp]+1] && pos[G[tmp]] == pos[G[tmp]+1])
                G[tmp]++;
            else
                G[tmp] = 0;
        } else {
            int tmp = pos[vec[i].p];
            v[vec[i].p] = 1;
            modify(1, vec[i].p, 1);
            if (G[tmp] == 0)
                G[tmp] = vec[i].p;
        }
    }
}

int main () {
    init();
    solve();
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116117.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月25日 下午9:00
下一篇 2022年1月25日 下午9:00


相关推荐

  • pycharm 2021.5.4 激活码【在线注册码/序列号/破解码】

    pycharm 2021.5.4 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    46
  • 1nv04dp是什么芯片_电平转换芯片总容易弄混淆了

    1nv04dp是什么芯片_电平转换芯片总容易弄混淆了可实现3.3V到5V或者5V到3.3V的电平转换共分两组8位  1B1到1B8(5V)对应1A1到1A8(3.3V),可通过1DIR控制电平转换方向2B1到2B8(5V)对应2A1到2A8(3.3V),可通过1DIR控制电平转换方向

    2022年8月10日
    7
  • apache 配置跨域

    apache 配置跨域<VirtualHost*:80>DocumentRoot“D:/project/xuanhua_shop/public”ServerName192.168.18.182#servername后的ip为接口所在服务器IP<Directory“D:/project/xuanhua_shop/public”>OptionsIndexesFollowSymLinksMultiViews Options+Indexes+Includes+FollowSymLi

    2022年7月14日
    16
  • gitlab+jenkins+docker 实现自动化部署(一)

    gitlab+jenkins+docker 实现自动化部署(一)gitlab jenkins docker 实现自动化部署超详细 爆肝

    2026年3月19日
    2
  • linux 内核驱动–Platform Device和Platform_driver注册过程[通俗易懂]

    linux 内核驱动–Platform Device和Platform_driver注册过程[通俗易懂]

    转自网络,自己学习用
     
    从Linux2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。
    Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。

    Linuxplatformdriver机制和传统的devicedriver 机制(通过driver_register函数进行注册

    2022年7月24日
    11
  • 二元logistic回归模型——spss步骤

    二元logistic回归模型——spss步骤二元:因变量为二分类变量,且两个分类整合在一起的概率为1.(有效/无效;是/否)分析——回归——二元logistic——结果作为因变量——自变量作为协变量分类——设置分类变量(非连续变量)——变化量、第一个保存——概率、组成员选项:霍斯默-莱梅肖拟合优度、Exp(B)置信区间——在每一个步骤结果分析:(1)看霍斯默检验的显著性:sig/p>0.05表示拟合良好。(2)方程中的变量:B——系数sig——p值——显著性Exp(B)——OR值——优势比(高出一个单位,发生的概率高出多少

    2025年7月28日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号