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

  但这题有一个地方需要注意,就是所求的个数有可能小于一个叶子结点中存储的任务个数,这时我们就要返回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. 理解HBase

    1.HBase HBase: Hadoop Database,根据Google的Big Table设计 HBase是一个分布式.面向列族的开源数据库.HDFS为Hbase提供了底层的数据存储服务,Ma ...

  2. python2.7练习小例子(十二)

        12):题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数" ...

  3. bzoj 一些题目汇总

    2140: 稳定婚姻 /* 求联通分量. */ #include<bits/stdc++.h> using namespace std; typedef long long LL; inl ...

  4. Error: Error while compiling statement: FAILED: SemanticException Unable to determine if hdfs://hadoopNode2:8020/user/hive/warehouse/test is encrypted...

    1.发现问题: 在hive客户端或者beeline查询hive表时候报错: 根据报错信息查看,是在集群namenode做了HA之后,产生的hdfs路径不对的问题: 2.解决问题,修改hive元数据my ...

  5. mock.js中新增测试接口无效,返回404

    项目是使用的npm+vue+mock模拟数据 我碰到的是在mock配置文件中新增接口,但是接口在测试时无效,返回404.但是在前端代码中把新接口换成配置文件中之前就有的,然后测试就正常了. 所以按问题 ...

  6. django 解决cors问题

    首页 博客 学院 下载 GitChat TinyMind 论坛 问答 商城 VIP 活动 招聘 ITeye CSTO 写博客 发Chat 登录注册 AFei0018-博客 穷则思变,差则思勤.Pyth ...

  7. 深入理解计算机系统(1)--hello world程序的生命周期

    第一篇笔记的主题是讨论Hello World程序的生命周期,程序是最简单的hello world程序,使用高级C语言编写. 先介绍整个生命周期中涉及到的几个部分以及相应的概念,然后总结整个生命周期,最 ...

  8. 3.Linux 文件的压缩与打包

    1.常用压缩打包命令 常用的压缩打包扩展名为如下: *.Z compress 程序压缩的文件,非常老旧了,不再细说 *.gz gzip 程序压缩的文件: *.bz2 bzip2 程序压缩的文件: *. ...

  9. Android2.2以上的版本HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不相等

    2.2以上的版本下载网络资源不完整无法更新.HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不等. 原因是:HttpURLConn ...

  10. Android4.0系统以上程序不出现菜单键的问题解决

    去掉targetSdkVersion 或改为targetSdkVersion =13或更小.. 不改targetSdkVersion的办法:在onCreate() 里setContentView()之 ...