Luogu 3168 [CQOI2015]任务查询系统
区间修改单点查询,又观察到是一个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]任务查询系统的更多相关文章
- Luogu P3168 [CQOI2015]任务查询系统
题目链接 \(Click\) \(Here\) 差分主席树,就是把主席树做成一个差分前缀和的形式,还是很容易想到的. 写主席树的时候几个注意点: 查询可能开始于所有任务之前,二分任务点要把左边界设置为 ...
- 「Luogu P3168 [CQOI2015]任务查询系统」
介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...
- 主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168
题目: [CQOI2015]任务查询系统 题解: 是一道很经典的题目.大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本.然而优先级范围到1e7去了,就离散化一遍.然后把每个事件的开始(s). ...
- BZOJ_3932_[CQOI2015]任务查询系统_主席树
BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- P3168 [CQOI2015]任务查询系统
题目地址:P3168 [CQOI2015]任务查询系统 主席树的模板题 更模板的在这儿:P3834 [模板]可持久化线段树 1(主席树) 形象的说,P3834是"单点修改,区间查询" ...
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
- [CQOI2015]任务查询系统 主席树
[CQOI2015]任务查询系统 LG传送门 以前还没见过主席树的这种写法. 考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代 ...
随机推荐
- jdbc connection为什么放在webINF的lib里面
jdbc connection为什么放在webINF的lib里面
- HTTP协议 与 Requests库
HTTP协议 与 Requests库: 1 HTTP协议: 2 URL作为网络定位的标识: >>>> 用户通过url来定位资源 >>>> 然后通过 g ...
- 4.MySQL优化---多表查询优化
整理自互联网 一.多表查询连接的选择: 相信这内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上我就不贴出来了.这图只是让大家回忆一下,各种连接查询. 然后要告诉大家的是,需要 ...
- php是如何工作的
a:前提条件: apache服务器启动正常工作 b:客户端浏览器在地址栏输入一个程序地栏 按回车发送请求 {请求}http://127.0.0.1/day03/1.php c:apache接收请求,并 ...
- tar 多文件解压压缩
tar 多文件解压:因为tar -zxvf一次值能解压一个文件,所以用xargs -n1 .先查找 ls *gz | xargs -n1 tar -zxvf .要解压的文件在list中 cat lis ...
- 两个VLC实现播放串流测试
实现原理: 一个VLC打开视频文件发布串流(格式HTTP.RTP.RTSP等),另一个VLC打开串流播放 发布串流步骤: 1.菜单“媒体”->“流”,先添加视频文件.选择“串流”,如下图: 2. ...
- 洛谷 P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 【LeetCode】673. Number of Longest Increasing Subsequence
题目: Given an unsorted array of integers, find the number of longest increasing subsequence. Example ...
- Js里头的对象字面量
JavaScript 对象字面量 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ) ...
- untra edit 自动补全
选择“高级-配置-编辑器-自动完成”,勾选“自动显示‘自动完成’对话框”,并在其中定义好“当输入x个字符”时,自动补全.