区间修改单点查询,又观察到是一个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. XML DOM学习

    XML 文档对象模型定义访问和操作XML文档的标准方法. XML DOM 是 XML Document Object Model 的缩写,即 XML 文档对象模型. DOM 将 XML 文档作为一个树 ...

  2. uva11729 - Commando War(贪心)

    贪心法,执行任务的时间J越长的应该越先交待.可以用相邻交换法证明正确性.其实对于两个人,要让总时间最短,就要让同一时间干两件事的时间最长. #include<iostream> #incl ...

  3. 重构代码 —— 函数即变量(Replace temp with Query)

    函数即变量,这里的函数指的是返回值为某一对象的函数.Replace temp with query,query 是一种查询函数. example 1 double price() { return t ...

  4. linux中使用opdir_readdir读取目录中的信息

    #include <dirent.h>#include <stdio.h>#include <stdlib.h> int main(int argc, char * ...

  5. zookeeper安装搭建

    一  zookeeper介绍 因为要使用kafka,但是不想用kafka自带的,而且考虑到后面别的地方需要使用,比如分布式job,觉得独立的比较好. zookeeper目前资料一大把,但是一是我需要锻 ...

  6. Sentry深入

    Sentry的架构 内部架构 核心就是规则引擎以及Metadata Store:记录格式有两种,一种policy file记录授权内容,另外一种是通过命令方式进行授权:前者记录在策略文件中,保存形式是 ...

  7. dockerfile mysql

    FROM centos6.6-mysql5.5:0.0.4 MAINTAINER syberos:wangmo RUN mv /etc/my.cnf /etc/my.cnf.bak ADD my.cn ...

  8. Angular5学习笔记 - 创建、运行、发布项目(一)

    一.安装脚手架 npm install -g cnpm --registry=https://registry.npm.taobao.org #安装阿里镜像 npm install -g @angul ...

  9. 最小LINUX系统下U盘的挂载及卸载

    U盘挂载命令U盘插入的时候会显示启动信息,启动信息中sda: sda1指U盘的设备名为sda1dev设备目录下有一个sda1设备文件,此设备文件就是我们插入的U盘,我们将这个设备文件挂载到Linux系 ...

  10. 获取APK的package名和activity名

    使用 aapt dump badging + 需要安装的APK