BZOJ 3932 - 主席树

题目分析
在只打会主席树模板的情况下做了这道题,也算是深有体会。
首先任务可以差分:一个任务是(s, e, p), 则在s处+1, 在e+1处-1,符合前缀。但是我们要查询指定时间的前k任务之和,可以想到主席树,且符合差分性质。
1~n每个节点代表从开始时间到现在,每个节点下是一颗权值线段树。用建立主席树的方法先将新时间节点置为前一个时间(从前一个时间更新),再将当前时间的所有差分操作更新(从当前时间更新),得到的每个时间节点便是从开始到此时间的一颗权值线段树。刚开始本来打的指针,调试被逼无奈改为数组(真·好写)。
建好树过后,对于查询(x, k), 就在x时间节点的这颗权值线段树上查询前k个元素之和,线段树的查询就不赘述了,详见代码。
另外,空间真的是个迷,卡了半天RE。
code

#include<bits/stdc++.h>
using namespace std;
const int N = 1000005;
typedef long long ll;
int n, c[N * 4], lenc, m;
int p[N], taskCnt, maxx = -1, rt[N];
struct TASK{
int point, tag, id;
inline bool operator < (const TASK &b) const{
return point < b.point;
}
}task[N];
struct node{
int lc, rc;
ll sum, cnt;
node(){}
}tr[N * 15];
int pool;
vector<int> lists[N];
inline int read(){
int i = 0, f = 1; char ch = getchar();
for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());
if(ch == '-') f = -1, ch = getchar();
for(; ch >= '0' && ch <= '9'; ch = getchar()) i = (i << 3) + (i << 1) + (ch - '0');
return i * f;
}
inline void wr(ll x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) wr(x / 10);
putchar(x % 10 + '0');
}
inline void disc_init(){
sort(c + 1, c + lenc + 1);
lenc = unique(c + 1, c + lenc + 1) - (c + 1);
for(int i = 1; i <= m; i++) p[i] = lower_bound(c + 1, c + lenc + 1, p[i]) - c;
}
inline void insert(int x, int &y, int l, int r, int v, int cnt){
tr[y = ++pool] = tr[x];
tr[y].sum += cnt * c[v], tr[y].cnt += cnt;
if(l == r) return;
int mid = l + r >> 1;
if(v <= mid) insert(tr[x].lc, tr[y].lc, l, mid, v, cnt);
else insert(tr[x].rc, tr[y].rc, mid + 1, r, v, cnt);
}
inline ll query(int p, int l, int r, int k){
if(tr[p].cnt <= k) return tr[p].sum;
if(l == r) return c[l];
int mid = l + r >> 1;
if(k <= tr[tr[p].lc].cnt) return query(tr[p].lc, l, mid, k);
else return query(tr[p].rc, mid + 1, r, k - tr[tr[p].lc].cnt) + tr[tr[p].lc].sum;
}
int main(){
m = read(), n = read();
for(int i = 1; i <= m; i++){
task[++taskCnt].point = read(), task[taskCnt].tag = 1, task[taskCnt].id = i, lists[task[taskCnt].point].push_back(taskCnt);
task[++taskCnt].point = read() + 1, task[taskCnt].tag = -1, task[taskCnt].id = i, lists[task[taskCnt].point].push_back(taskCnt);
p[i] = c[++lenc] = read();
}
disc_init();
for(int i = 1; i <= n; i++){
insert(rt[i - 1], rt[i], 1, lenc, 0, 0);
for(int j = 0; j < lists[i].size(); j++)
insert(rt[i], rt[i], 1, lenc, p[task[lists[i][j]].id], task[lists[i][j]].tag);
}
ll pre = 1, ans;
for(int i = 1; i <= n; i++){
int x = read(), a = read(), b = read(), c = read();
ans = query(rt[x], 1, lenc, ((a * pre + b) % c) + 1);
wr(ans), putchar('\n');
pre = ans;
}
}
BZOJ 3932 - 主席树的更多相关文章
- bzoj 1901 主席树+树状数组
修改+查询第k小值 单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log 对了,bzoj上不需要读入组数,蜜汁re.. #include<cstdio> #in ...
- BZOJ 2588 主席树
思路: 主席树 做完BZOJ 3123 觉得这是道水啊-- 然后狂RE 狂MLE 要来数据 忘把deep[1]设成1了----------. 啊wocccccccccccccccc //By Siri ...
- bzoj 1818 主席树
思路:主席树搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #de ...
- BZOJ 4771 主席树+倍增+set
思路: 因为有深度的限制,并且我们是在线段树上维护权值,所以我们把点按照dep排序,然后一个一个修改...主席树的下标就是dfs序,子树的查询就是区间查询... 但是发现这样怎么去维护LCA呢...因 ...
- BZOJ 3674/BZOJ 3673 主席树
思路: 主席树维护可持久化数组 剩下的就是普通的并查集了- //By SiriusRen #include <cstdio> #include <cstring> #inclu ...
- BZOJ 3123 主席树 启发式合并
思路: 主席树 搞树上的k大 x+y-lca(x,y)-fa(lca(x,y)) 按照size小树往大树上插 启发式合并 n*log^2n的 搞定~ //By SiriusRen #include & ...
- BZOJ 4448 主席树+树链剖分(在线)
为什么题解都是离线的-- (抄都没法抄) 搞一棵主席树 1 操作 新树上的当前节点设成1 2 操作 查max(i-xx-1,0)那棵树上这条路径上有多少个点是1 让你找经过了多少个点 查的时候用dee ...
- BZOJ 3524主席树裸题 (雾)
思路: 按权值建一棵主席树 (但是这好像不是正解 空间复杂度是不对的--.) //By SiriusRen #include <cstdio> #include <cstring&g ...
- BZOJ 3524 - 主席树
传送门 题目分析 标准主席树,按照位置插入每个数,对于询问l, r, 在l-1,r两树上按照线段树搜索次数大于(r - l + 1) / 2的数. code #include<bits/stdc ...
随机推荐
- JS学习笔记 - fgm练习 - 数字自增 定时器 数字比大小Math.max
<script> window.onload = function(){ var oP = document.getElementsByTagName('p')[0]; var i = 0 ...
- 洛谷 P1170 兔八哥与猎人
P1170 兔八哥与猎人 题目描述 兔八哥躲藏在树林旁边的果园里.果园有M × N棵树,组成一个M行N列的矩阵,水平或垂直相邻的两棵树的距离为1.兔八哥在一棵果树下. 猎人背着猎枪走进了果园,他爬上一 ...
- [D3] Add image to the node
We can create node with 'g' container, then append 'image' to the nodes. // Create container for the ...
- iOS开发之CocoaPods(objective-c第三方库管理工具)
介绍: iOS开发中,大多数情况下,我们都须要集成一些第三方依赖库.对于一个稍大的项目,用到的第三方依赖库的数量也很可观.CocoaPods是objective-c第三方库管理工具,方便第三方库的管理 ...
- 主定理(Master Theorem)与时间复杂度
1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...
- 手机用appnium,web自动化用eclips+webdriver2
手机用appnium,web自动化用eclips+webdriver2 吴建清 pycharm 1.安装环境2.pycharm类似eclipse,写脚本,运行脚本3.uiautomatorviewer ...
- 折腾了我两天的springboot数据源datasource循环依赖问题,都被搞疯掉了
在做项目重构的时候增加了两个功能 1.多数据源. 2.token的验证从以前的数据库验证,移到了redis端. 1.多数据源使用 druid-spring-boot-starter 套件 其核心代码如 ...
- ThreadPoolExecutor – Java Thread Pool Example(java线程池创建和使用)
Java thread pool manages the pool of worker threads, it contains a queue that keeps tasks waiting to ...
- xmppframework开发基础
xmppframework是XMPP协议的一个objective-c实现. 要了解xmppframework, 从这里開始吧:https://github.com/robbiehanson/XMPPF ...
- cocos2d-x游戏开发 跑酷(九) 源代码下载及小结
这个东西零零碎碎写了一个礼拜吧. 事实上也没多少东西在里面.文章后附下载地址 博客地址:http://blog.csdn.net/dawn_moon 由于我没用过chipmunk,并且它是面向过程的东 ...