区间修改单点查询,又观察到是一个k小,考虑主席树上做差分
一开始样例疯狂挂,后来发现主席树在一个历史版本上只能修改一次,所以要开2*n个根结点,记录一下每个时间对应的根结点编号
然后80分,考虑到当一个排名的结点有w个而查询的k<w时会使答案变大,所以特判(但是一开始又喜闻乐见地把符号写反了)~
一通乱改+疯狂提交后水过

Code:

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll; const int N = 1e5 + ;
const ll inf = (ll) << ; int n, qn, bel[N], maxn = ;
ll val[N];
vector <int> ins[N], del[N]; struct Task {
int st, ed;
ll pri;
} a[N]; struct Innum {
int id;
ll val;
} in[N]; bool cmp(const Innum &x, const Innum &y) {
if(x.val != y.val) return x.val < y.val;
else return x.id < y.id;
} template <typename T>
inline void read(T &X) {
X = ;
char ch = ;
T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline void discrete() {
in[].val = -inf;
sort(in + , in + + n, cmp);
int cnt = ;
for(int i = ; i <= n; i++) {
if(in[i].val != in[i - ].val) ++cnt;
maxn = max(maxn, cnt);
val[cnt] = in[i].val;
a[in[i].id].pri = cnt;
}
} struct Node {
int lc, rc, cntSum;
ll priSum;
}; namespace PSegT {
int root[N << ], nodeCnt;
Node s[N * ]; #define mid (l + r) / 2 inline void up(int p) {
s[p].cntSum = s[s[p].lc].cntSum + s[s[p].rc].cntSum;
s[p].priSum = s[s[p].lc].priSum + s[s[p].rc].priSum;
} void insert(int &p, int l, int r, int x, int pre, int type) {
p = ++nodeCnt;
s[p] = s[pre];
s[p].cntSum += type;
s[p].priSum += (ll)type * val[x]; if(l == r) return; if(x <= mid) insert(s[p].lc, l, mid, x, s[pre].lc, type);
else insert(s[p].rc, mid + , r, x, s[pre].rc, type); // up(p);
} ll query(int p, int l, int r, int k) {
// if(l == r) return s[p].priSum;
if(l == r) return k < s[p].cntSum ? (ll)k * val[l] : s[p].priSum;
int now = s[s[p].lc].cntSum; ll res = ;
if(k <= now) res = query(s[p].lc, l, mid, k);
else res = s[s[p].lc].priSum + query(s[p].rc, mid + , r, k - now);
return res;
} void print(int p, int l, int r) {
printf("(%d %d %d %d %lld) ", p, s[p].lc, s[p].rc, s[p].cntSum, s[p].priSum);
if(l == r) return;
print(s[p].lc, l, mid);
print(s[p].rc, mid + , r);
} #undef mid } using namespace PSegT; int main() {
read(n), read(qn);
for(int i = ; i <= n; i++) {
read(a[i].st), read(a[i].ed), read(a[i].pri);
in[i].val = a[i].pri, in[i].id = i;
ins[a[i].st].push_back(i);
del[a[i].ed + ].push_back(i);
}
discrete(); nodeCnt = root[] = ;
int rtCnt = ;
for(int i = ; i <= qn; i++) {
for(unsigned int j = ; j < ins[i].size(); j++)
++rtCnt, insert(root[rtCnt], , maxn, a[ins[i][j]].pri, root[rtCnt - ], );
for(unsigned int j = ; j < del[i].size(); j++)
++rtCnt, insert(root[rtCnt], , maxn, a[del[i][j]].pri, root[rtCnt - ], -);
bel[i] = rtCnt;
} /* for(int i = 1; i <= rtCnt; i++, printf("\n"))
print(root[i], 1, maxn); */ ll ans = ;
for(int x, k, _a, _b, _c; qn--; ) {
read(x), read(_a), read(_b), read(_c);
k = + ((ll)_a * ans + _b) % _c;
if(k >= s[root[bel[x]]].cntSum) printf("%lld\n", ans = s[root[bel[x]]].priSum);
else printf("%lld\n", ans = query(root[bel[x]], , maxn, k));
} return ;
}

感觉vector还挺快的……

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. STL的erase函数和lower_bound

    前提摘要: [1]一般我们的区间是左闭右开,如下面例子2. [2]erase函数谨慎使用. [3]map也是有序保存的. [erase] 1,删除字符串的首字母: string s="ecu ...

  2. 开发mis系统用到的技术

    1. b/s架构:就broser/server,浏览器/服务器的说法.服务器端要运行tomcat,提供链接数据库服务供java代码读写数据,这个可以在eclipse中配置运行.浏览器则解释jsp或ht ...

  3. Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114

    年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...

  4. 一道SQL的面试题之联想

    一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给 ...

  5. bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...

  6. win32 获取本机网卡信息(MAC地址,IP地址等)

    由于一个需求需要获取网卡的MAC地址,就搜了一下,大部分都是COPY来COPY去的一些代码,有很多甚至不能直接运行或有还有内存泄漏.自己查了一下MSDN然后封装了一下: 需要注意,一个机器可能有多个网 ...

  7. 蓝桥杯 算法训练 ALGO-122 未名湖边的烦恼

    算法训练 未名湖边的烦恼   时间限制:1.0s   内存限制:256.0MB 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都 ...

  8. Oracle RMAN 学习:恢复

    Oracle RMAN 学习:恢复 6 rman恢复 Rman中的恢复对应restore,recover Restore,数据修复,利用备份集的数据文件来替换已损坏的数据文件或将其恢复到另外一个位置, ...

  9. CentOS7 线上环境的一些 配置

    上周服务器被攻击导致上面收回了我们服务器的IP,所以这周重新安装部署了服务器,使用centos7系统.为了防止服务器再次被攻击,所以建议以下几点: 1. root密码要复杂一点,尽量字母数字特殊字符都 ...

  10. spring 框架整合

    struts hibernate spring 先贴出框架整合需要的maven <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...