[CQOI2015]任务查询系统

LG传送门

以前还没见过主席树的这种写法。

考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代码。

关于为什么可以做的一点思考:主席树其实类似于求前缀和,平时我们是用来区间查询,这里对于差分后的信息用主席树一维护,就变成了原来的信息,可以单点查询,而我们这道题的要求正好是区间修改单点查询。

//written by newbiechd
#include <cstdio>
#include <cctype>
#include <algorithm>
#define R register
#define I inline
#define B 1000000
#define L long long
using namespace std;
const int N = 100003, M = 1e7;
char buf[B], *p1, *p2;
I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
I int rd() {
    R int f = 0;
    R char c = gc();
    while (c < 48 || c > 57)
        c = gc();
    while (c > 47 && c < 58)
        f = f * 10 + (c ^ 48), c = gc();
    return f;
}
int rt[N], T;
struct task {
    int t, p, d;
    task () {}
    task (int t, int p, int d) : t(t), p(p), d(d) {}
    I int operator < (const task &x) { return t < x.t; }
}t[N << 1];
struct segtree {
    int p, q, s;
    L t;
}e[N << 6];
int insert(int k, int l, int r, int x, int y) {
    R int t = ++T;
    e[t] = e[k], e[t].s += y, e[t].t += y * x;
    if (l == r)
        return t;
    R int m = (l + r) >> 1;
    if (x <= m)
        e[t].p = insert(e[k].p, l, m, x, y);
    else
        e[t].q = insert(e[k].q, m + 1, r, x, y);
    return t;
}
L query(int k, int l, int r, int x) {
    if (l == r)
        return l * x;
    R int m = (l + r) >> 1, t = e[e[k].p].s;
    if (x <= t)
        return query(e[k].p, l, m, x);
    else
        return e[e[k].p].t + query(e[k].q, m + 1, r, x - t);
}
int main() {
    int m = rd(), n = rd(), S = 0, i, j, x, y, z;
    L ans = 1;
    for (i = 1; i <= m; ++i)
        x = rd(), y = rd(), z = rd(),
            t[++S] = task(x, z, 1), t[++S] = task(y + 1, z, -1);
    sort(t + 1, t + S + 1);
    for (i = 1, j = 1; i <= n; ++i) {
        rt[i] = rt[i - 1];
        for (; j <= S && t[j].t == i; ++j)
            rt[i] = insert(rt[i], 1, M, t[j].p, t[j].d);
    }
    for (i = 1; i <= n; ++i) {
        x = rd(), y = (ans * rd() + rd()) % rd() + 1;
        if (e[rt[x]].s <= y)
            ans = e[rt[x]].t;
        else
            ans = query(rt[x], 1, M, y);
        printf("%lld\n", ans);
    }
    return 0;
}

[CQOI2015]任务查询系统 主席树的更多相关文章

  1. BZOJ3932: [CQOI2015]任务查询系统 主席树

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4869  Solved: 1652[Submit][St ...

  2. 【BZOJ3932】[CQOI2015]任务查询系统 主席树

    [BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...

  3. bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...

  4. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]

    题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...

  5. BZOJ 3932: [CQOI2015]任务查询系统 [主席树]

    传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...

  6. BZOJ3932[CQOI2015]任务查询系统——主席树

    题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...

  7. BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)

    题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...

  8. BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题

    题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...

  9. BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)

    就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...

随机推荐

  1. MySQL存储引擎之Spider内核深度解析

      作者介绍 朱阅岸,中国人民大学博士,现供职于腾讯云数据库团队.研究方向主要为数据库系统理论与实现.新硬件平台下的数据库系统以及TP+AP型混合系统. Spider是为MySQL/MariaDB开发 ...

  2. [翻译] EAIntroView

    EAIntroView https://github.com/ealeksandrov/EAIntroView   This is highly customizable drop-in soluti ...

  3. Ardunio控制RGB的LED灯显示彩虹渐变色.

    由于我使用的是共阴极的RGB LED,如果你的是共阳极的,接线的时候要注意一下. 其他没什么不同 //定义RGB色彩的输出I/O ; ; ; //标记颜色变化的方式,增加值还是减小值 bool red ...

  4. Scala编程之访问修饰符

    private ,protected,public,在不加前两者声明时为public为公共式访问: private为私有式访问:protected为家族式访问,与Java一致. object Oute ...

  5. 只要下面看到func() 带括号的,就会弹上去找对应的函数,然后执行相应的函数块

    def func1(): print("呵呵")def func2(): print("呵呵")def func3(): print("呵呵" ...

  6. 【Alpha】Daily Scrum Meeting

    一 博客集合贴 11月15日 [Alpha]Daily Scrum Meeting——blog1 11月18日 [Alpha]Daily Scrum Meeting——blog2 11月19日 [Al ...

  7. python的unittest框架中如何删除测试数据,清理环境,可以通过addCleanup函数

    def addCleanup(self, function, *args, **kwargs): """Add a function, with arguments, t ...

  8. Java Math类学习

    1.  java.lang.Math Math类其成员皆为静态成员(static),无需创建对象,直接用类名Math作为前缀使用它们即可. 2.  Math类有两个静态常量:E(自然对数)和PI(圆周 ...

  9. ios的图片解压

    YYKit SDWebImage FLAnimatedImage YYKit YYCGImageCreateDecodedCopy YYImageCoder 1 2 3 4 5 6 7 8 9 10 ...

  10. 【CF917D】Stranger Trees

    题目 看题解的时候才突然发现\(zky\)讲过这道题啊,我现在怕不是一个老年人了 众所周知矩阵树求得是这个 \[\sum_{T}\prod_{e\in T}w_e\] 而我们现在的这个问题有些鬼畜了, ...