题目地址:P3168 [CQOI2015]任务查询系统

主席树的模板题

更模板的在这儿:P3834 【模板】可持久化线段树 1(主席树)

形象的说,P3834是“单点修改,区间查询”,P3168是“区间修改,单点查询”

注意!这里只是形象的说,实际上两道题都是静态的

我们联想其他的“区间修改,单点查询”问题,我们都是怎么做的?

差分!

没错,差分,将“区间修改”改成“左端点加,右端点的右边减”的“单点修改”

那么,我们每次“单点查询”就相当于求前缀和,也就是一个“区间查询”

于是我们成功的将P3168转化成了P3834,然后就简单了

几个注意点:

  • 公式 \(K_i=1+(A_i*Pre+B_i)\ mod\ C_i\) 会爆 int,注意开 long long

  • 需要先进行离散化, \(sort+unique\) 即可

  • 主席树要开 \(2*N\ log\ N\) ,其中 \(2\) 是因为差分以后“单点修改”的数量为原来“区间修改”的两倍(我的代码中直接将 N 扩大了一倍)

  • 不要修改第 \(n+1\) 个区间,即修改到第 \(n+1\) 个区间就可以直接 break

  • 在询问到 \(l==r\) 时不能直接返回 \(sum\) 而要返回 \(t[p].s / t[p].c * k\)

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define x first
#define y second
using namespace std;
const int N = 2e5 + 6;
int n, m, pre = 1, b[N], rt[N], tot;
pii a[N];
struct T {
    int l, r, c, s;
} t[N*20];

int build(int l, int r) {
    int p = ++tot;
    if (l == r) return p;
    int mid = (l + r) >> 1;
    t[p].l = build(l, mid);
    t[p].r = build(mid + 1, r);
    return p;
}

int change(int o, int l, int r, int p, int k) {
    int q = ++tot;
    t[q] = t[o];
    if (l == r) {
        t[q].c += k;
        t[q].s += k * b[p];
        return q;
    }
    int mid = (l + r) >> 1;
    if (p <= mid) t[q].l = change(t[o].l, l, mid, p, k);
    else t[q].r = change(t[o].r, mid + 1, r, p, k);
    t[q].c = t[t[q].l].c + t[t[q].r].c;
    t[q].s = t[t[q].l].s + t[t[q].r].s;
    return q;
}

int ask(int p, int l, int r, int k) {
    if (l == r) return t[p].s / t[p].c * k;
    int mid = (l + r) >> 1;
    if (k <= t[t[p].l].c) return ask(t[p].l, l, mid, k);
    else return t[t[p].l].s + ask(t[p].r, mid + 1, r, k - t[t[p].l].c);
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int p = (i << 1) - 1, q = i << 1;
        scanf("%d %d %d", &a[p].x, &a[q].x, &a[p].y);
        ++a[q].x;
        a[q].y = -a[p].y;
        b[i] = a[p].y;
    }
    sort(b + 1, b + n + 1);
    int w = unique(b + 1, b + n + 1) - (b + 1);
    rt[0] = build(1, w);
    sort(a + 1, a + (n << 1) + 1);
    int k = 1;
    for (int i = 1; i <= (n << 1); i++) {
        while (k < a[i].x) {
            rt[k+1] = rt[k];
            ++k;
        }
        if (k == n + 1) break;
        int p = lower_bound(b + 1, b + w + 1, abs(a[i].y)) - b;
        rt[k] = change(rt[k], 1, w, p, a[i].y > 0 ? 1 : -1);
    }
    while (m--) {
        int xi, ai, bi, ci;
        scanf("%d %d %d %d", &xi, &ai, &bi, &ci);
        int ki = ((ll)ai * pre + bi) % ci + 1;
        if (t[rt[xi]].c <= ki) printf("%d\n", pre = t[rt[xi]].s);
        else printf("%d\n", pre = ask(rt[xi], 1, w, ki));
    }
    return 0;
}

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

  1. bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)

    P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...

  2. 洛谷 P3168 [CQOI2015]任务查询系统 解题报告

    P3168 [CQOI2015]任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组\((S_i,E_i,P_i) ...

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

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

  4. ●洛谷P3168 [CQOI2015]任务查询系统

    题链: https://www.luogu.org/problemnew/show/P3168题解: 主席树 强制在线? 那就直接对每一个前缀时间建一个线段树(可持久化线段树),线段树维护优先度权值. ...

  5. P3168 [CQOI2015]任务查询系统(主席树)

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

  6. 洛谷P3168 [CQOI2015]任务查询系统

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  7. Luogu P3168 [CQOI2015]任务查询系统

    题目链接 \(Click\) \(Here\) 差分主席树,就是把主席树做成一个差分前缀和的形式,还是很容易想到的. 写主席树的时候几个注意点: 查询可能开始于所有任务之前,二分任务点要把左边界设置为 ...

  8. p3168 [CQOI2015]任务查询系统(差分+主席树)

    恕我才学浅薄,一开始想到的是树状数组+线段树,然后看了题解才第一次见到了差分这种神奇的科技 仔细想想,主席树的本质不就是前缀和嘛,加上一个差分也是可以的,没想到真是罪过罪过 对时间维护一个差分 在Si ...

  9. 「Luogu P3168 [CQOI2015]任务查询系统」

    介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...

随机推荐

  1. CentOS7 yum安装、配置PostgreSQL 9.5

    PostgreSQL 9.5安装 1.添加RPM yum install https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-7 ...

  2. 信用评分卡Credit Scorecards (1-7)

      欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 python风控评分卡建模和风控常识 https://study.163.com/course/introductio ...

  3. 6-(基础入门篇)学会编译lua固件,固件的合成

    http://www.cnblogs.com/yangfengwu/p/9336274.html 基础教程源码链接请在淘宝介绍中下载,由于链接很容易失效,如果失效请联系卖家,谢谢 https://it ...

  4. ansible Api 2.3-2.4

    官网示例(python3) 说明: 在学习2.0 api的过程中遇到了一个坑,最新版的ansible(2.4)和2.3版本api引用时发生了变化,本文主要使用2.3 api进行操作,2.4只做分析 a ...

  5. vue常用的路由对象

    官网上解释:一个路由对象表示当前激活的路由的状态信息 路由对象,在组件内即this.$route,存着一些与路由相关的信息,当路由切换时,路由对象会被更新 //如果要在刷新页面时候通过路由的信息来操作 ...

  6. [Android] Android 使用 Greendao 操作 db sqlite(2)-- 封装DaoUtils类

    继续接上文: Android 使用 Greendao 操作 db sqlite(1)-- 直接在MainActivity中调用 布局文件同上文一致,这里就不贴了. 一.封装DaoUtils类 User ...

  7. SQLite 数据库介绍和基本用法

    Ø  简介 SQLite 是一款轻量级的关系型数据库,同时也是一种嵌入式数据库,与 Oracle.MySQL.SQL Server 等数据库不同,它可以内嵌在程序中,是程序中的一个组成部分.所以,经常 ...

  8. 关于TCP/IOCP构架中出现的Socket假死连接解决方案

    如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接. 假死连接具体表现如下: 1.在s端机器上,会有一些处于TCP_EST ...

  9. PHP WeBaCoo后门学习笔记

    PHP WeBaCoo后门学习笔记 - PHP WeBaCoo backdoor learning notes WeBaCoo (Web Backdoor Cookie) 是一款隐蔽的脚本类Web后门 ...

  10. file图片上传之前先预览

    链接:https://www.cnblogs.com/tandaxia/p/5125275.html 记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<inp ...