主席树,操作上面基本上是一样的。每一个时间节点一棵树,一个树上的每个节点代表一个优先级的节点。把开始和结束时间点离散,在每一棵树上进行修改。注意因为一个时间节点可能会有多个修改,但我们要保证都在同一棵树上,所以我采取了让每个节点额外存储所属于的树的一个信息。当更新到一个节点的时候,如果属于建立好的新树,那么就修改;不属于,则重新建链。

  但这题有一个地方需要注意,就是所求的个数有可能小于一个叶子结点中存储的任务个数,这时我们就要返回k * num。

代码(有的地方感觉自己写的有些啰嗦,大家看看就好):

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 1500000
int n, m, timer, tot, cnt, sum, pre = , root[maxn], Ti[maxn];
map <int, int> Map;
bool vis[maxn];
struct node
{
int t, num;
}upd[maxn * ]; struct tree
{
int lson, rson, cal, root, size, rank;
}T[maxn * ]; struct project
{
int s, e, p;
}P[maxn]; bool cmp(project a, project b)
{
return a.p < b.p;
} bool cmp2(node a, node b)
{
return a.t < b.t;
} int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void update(int &now, int bf, int x, int num, int l, int r, int root)
{
if(root != T[now].root) now = ++ sum, T[now] = T[bf], T[now].root = root;
if(num > ) T[now].size += ;
else T[now].size -= ;
if(l == r)
{
T[now].cal += num;
T[now].rank = num;
return;
}
int mid = (l + r) >> ;
if(x <= mid) update(T[now].lson, T[bf].lson, x, num, l, mid, root);
else update(T[now].rson, T[bf].rson, x, num, mid + , r, root);
T[now].cal = T[T[now].lson].cal + T[T[now].rson].cal;
} int query(int now, int L, int R, int k)
{
int mid = (L + R) >> ;
int size = T[T[now].lson].size;
if(L == R) return k * T[now].rank;
if(k >= T[now].size) return T[now].cal;
if(k <= size) return query(T[now].lson, L, mid, k);
else return query(T[now].lson, L, mid, size) + query(T[now].rson, mid + , R, k - size);
} signed main()
{
m = read(), n = read();
for(int i = ; i <= m; i ++)
{
P[i].s = read(), P[i].e = read(), P[i].p = read();
upd[++ cnt] = (node) {P[i].s, P[i].p};
upd[++ cnt] = (node) {P[i].e + , -P[i].p};
}
sort(P + , P + + m, cmp);
for(int i = ; i <= m; i ++)
if(P[i].p != P[i - ].p) Map[P[i].p] = ++ tot;
sort(upd + , upd + + cnt, cmp2);
for(int i = ; i <= cnt; i ++)
{
if(upd[i].t != upd[i - ].t)
{
int now = ++ timer; Ti[upd[i].t] = now;
root[timer] = ++ sum;
int t = upd[i].t - ;
while(!Ti[t]) Ti[t] = now - , t --;
}
int t = Ti[upd[i].t];
update(root[t], root[t - ], Map[abs(upd[i].num)], upd[i].num, , tot, t);
vis[t] = true;
}
for(int i = ; i <= n; i ++)
{
int x = read(), a = read(), b = read(), c = read();
int ans, k = + (a * pre + b) % c;
printf("%lld\n", ans = query(root[Ti[x]], , tot, k));
pre = ans;
}
return ;
}

【题解】CQOI2015任务查询系统的更多相关文章

  1. 题解 [CQOI2015]任务查询系统

    题面 解析 首先,我们考虑下暴力的做法: 每次将一个任务的重要度加入到它的区间中, 询问的时候就直接加前\(k\)大. 然而,这样肯会炸的(都说了是暴力了). 其实,我们可以转化一下区间修改(因为区间 ...

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

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

  3. 主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168

    题目: [CQOI2015]任务查询系统 题解: 是一道很经典的题目.大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本.然而优先级范围到1e7去了,就离散化一遍.然后把每个事件的开始(s). ...

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

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

  5. BZOJ_3932_[CQOI2015]任务查询系统_主席树

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

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

    题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...

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

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

  8. 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)

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

  9. [CQOI2015]任务查询系统 主席树

    [CQOI2015]任务查询系统 LG传送门 以前还没见过主席树的这种写法. 考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代 ...

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

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

随机推荐

  1. BootStrap的动态模态框及静态模态框

    1.要用bootStrap这个框架就必须要重载它的class类,也就是说class要一样 代码如下: 有疑问的可以在下面留言,欢迎大家一起交流 1.1动态模态框 <!DOCTYPE html&g ...

  2. django 面试题

    面试题1:migrate怎么判断哪些迁移脚本需要执行: 他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移 ...

  3. 介绍几个PHP 自带的加密解密函数

    PHP 自带的加密解密函数 目前经常使用的加密函数有:md5(), sha1(), crypt(), base64_encode(), urlencode() . 其中 md5(), sha1(), ...

  4. Vue2+VueRouter2+webpack+vue-cil构建完整项目实例(附:详细步骤截图)

    引用1:https://segmentfault.com/a/1190000008557578 引用2:https://blog.csdn.net/wulala_hei/article/details ...

  5. php-5.6.26源代码 - hash存储结构 - 添加

    添加 , (void *)module, sizeof(zend_module_entry), (void**)&module_ptr){ // zend_hash_add 定义在文件“php ...

  6. 08 datetime与logging模块(进阶)

    datetime与logging模块 阶段一:日期与时间 1.datetime 模块中 主要类: 类名 功能说明 date 日期对象,常用的属性有year, month, day time 时间对象h ...

  7. JavaScript之this解析

    1.解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式不同,this会指向不同的对象 ...

  8. 002---tcp/ip五层详解

    tcp/ip 五层模型讲解 越靠底层就越接近硬件,越靠上层越接近用户.先从底层看起,理解整个互联网通信的原理. 物理层(传输电信号) 孤立的计算机想要一起玩.就必须用硬件在计算机之间完成组网.以硬件做 ...

  9. python的正则表达一

    一.常用的正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种 ...

  10. allegro导入网表过程中出现的错误信息

    1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...