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

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

    页面内容:一个按钮标签  一个Img标签 实现原理:通过修改Img标签的src属性,实现图片的切换 备注:代码中flag变量仅仅用作标记,也可以直接用Img标签的src属性进行判断,不过在判断时候不能 ...

  2. jQuery获取data-*属性值

    下面就详细介绍四种方法获取data-*属性的值 <li id="getId" data-id="122" data-vice-id="11&qu ...

  3. 在Vue项目里面使用d3.js

    之前写一个 Demo里面 有些东西要使用d3实现一些效果 但是在很多论坛找资源都找不到可以在Vue里面使用D3.js的方法,npm 上面的D3相对来说 可以说是很不人性化了 完全没有说 在webpac ...

  4. Java小功能大杂烩

    生成UUID: import java.util.UUID; public class ProductUUID { // 随机返回前十位的UUID public static String getUU ...

  5. MySQL单表数据查询(DQL)

    数据准备工作: CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, sname ), age TINYINT, city ), scor ...

  6. jquer搜索

    <body> <br/> <center> <tr><td>创建时间:</td><td><input type ...

  7. 带cookie请求数据

    经常会用到一些采集网上的资源,普通网站很好采,get_file_contents()/c_url(). 有的网站会有登陆后才能采集,需要带cookie请求获取(登陆网站相同方法),下面记录一下使用方法 ...

  8. ctf题目writeup(4)

    2019.1.31 题目:这次都是web的了...(自己只略接触隐写杂项web这些简单的东西...) 题目地址:https://www.ichunqiu.com/battalion 1. 打开链接: ...

  9. 8-C++远征之继承篇-学习笔记

    C++远征之继承篇 开篇介绍 整个C++远征计划: 起航->离港->封装->继承 为什么要用继承? 为什么要有继承? 如何来定义基类 <----> 派生类? 基类到派生类 ...

  10. xssbypass小记

    简单整理下bypass的一些点 标签外 如果是标签之外 又有htmlspecialchars函数的点 就别想了 在标签外同时能xss但是有长度限制 如果是储存型可以利用多个点 然后构造<scri ...