BZOJ3932: [CQOI2015]任务查询系统
真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了。
这道题应该也是算是主席树的经典运用。
刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了。写完后才意识到树状数组无法(很难?)实现区间修改。
然后想了想既然这个是一下子把所有修改都放上了直接用树状数组差分一下不就好了!
然后又深感自己制杖,为什么要用树状数组差分呢,直接开几个vector维护一下就行了。
说是修改,本质上是不带修改的主席树,很快搞完。WA,眼查,无果,跟踪,无果。
拍了几组小数组测了测,最后发现问题是这样的:以往的线段树在更新对应的权值线段树时只需要更新一个pos,而这个要更新很多个pos,就会导致一些层直接修改到以前的版本。
最后的解决办法就是对于每个点,开两个交叉更新即可。
语文不好QAQ,直接看代码比较清晰。
//BZOJ 3932 //by Cydiater //2016.12.8 #include <iostream> #include <cmath> #include <iomanip> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <map> #include <algorithm> #include <ctime> #include <bitset> #include <set> #include <vector> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) #define pii pair<int,int> #define FILE "cqoi15_query" const int MAXN=1e5+5; const int oo=0x3f3f3f3f; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,M,fsort[MAXN],rnum=0,cnt=0,root[MAXN<<5]; ll Pre=1; struct Query{ int S,T,P; }query[MAXN]; struct Chair_man_Tree{ int tol,son[2]; ll sum; }t[MAXN<<6]; vector<pii> op[MAXN]; namespace solution{ int NewNode(int tol,ll sum,int son0,int son1){ t[++cnt].tol=tol;t[cnt].sum=sum; t[cnt].son[0]=son0;t[cnt].son[1]=son1; return cnt; } void insert(int leftt,int rightt,int &Root,int last,int pos,int flag){ Root=NewNode(t[last].tol+flag,t[last].sum+fsort[pos]*flag,t[last].son[0],t[last].son[1]); if(leftt==rightt) return; int mid=(leftt+rightt)>>1; if(pos<=mid) insert(leftt,mid,t[Root].son[0],t[last].son[0],pos,flag); else insert(mid+1,rightt,t[Root].son[1],t[last].son[1],pos,flag); } void Build(){ N=read();M=read(); up(i,1,N){ int S=read(),T=read(),P=read(); fsort[++rnum]=P; query[i]=(Query){S,T,P}; } sort(fsort+1,fsort+rnum+1); rnum=unique(fsort+1,fsort+rnum+1)-(fsort+1); up(i,1,N){ int S=query[i].S,T=query[i].T,P=query[i].P,pos=lower_bound(fsort+1,fsort+rnum+1,P)-fsort; op[S].push_back(make_pair(pos,1));op[T+1].push_back(make_pair(pos,-1)); } up(i,1,M){ int last=root[i-1],now; up(j,0,(int)op[i].size()-1){ pii tmp=op[i][j]; int pos=tmp.first,flag=tmp.second; insert(1,rnum,now,last,pos,flag); last=now; } root[i]=last; } } ll Get(int leftt,int rightt,int Root,ll rnk){ ll sum=t[Root].sum,tol=t[Root].tol; if(leftt==rightt) return min(tol,rnk)*fsort[leftt]; sum=t[t[Root].son[0]].sum;tol=t[t[Root].son[0]].tol; int mid=(leftt+rightt)>>1; if(rnk>=tol) return sum+Get(mid+1,rightt,t[Root].son[1],rnk-tol); else return Get(leftt,mid,t[Root].son[0],rnk); } void Slove(){ while(M--){ ll X,A,B,C,K; X=read();A=read();B=read();C=read(); K=1+(A*Pre+B)%C; printf("%lld\n",(Pre=Get(1,rnum,root[X],K))); } } } int main(){ //freopen("input.in","r",stdin); //freopen("out1.out","w",stdout); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); using namespace solution; Build(); Slove(); return 0; }
BZOJ3932: [CQOI2015]任务查询系统的更多相关文章
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- BZOJ3932[CQOI2015]任务查询系统——主席树
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...
- 并不对劲的bzoj3932: [CQOI2015]任务查询系统
传送门-> 离线操作听上去很简单,遗憾的是它强制在线. 每个时刻可以看成可持久化线段树中的一个版本,而每一个版本的线段树维护的是值某一段区间且在这个版本对应的时刻出现的数之和. 会发现同一时刻可 ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...
- BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化
记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...
随机推荐
- 【转】 iOS9.2-iOS9.3.3越狱插件清单
以下是iOS9.3.3越狱插件清单 原文地址:http://bbs.feng.com/read-htm-tid-10668605.html 序列 支持与否 插件名称 兼容版本 支持设备 1 是 20 ...
- BCS 字段显示格式化
技术部分 1.使用SPD添加外部数据源时保证,安装SPD的客户机在同一个域中,并且在管理中心给Business Data Connectivity Service 授权 2.生成的外部数据没法再后 ...
- jQuery的性能优化
原文链接:http://www.colotu.com/html/gcs/6.html 现在越来越多的人应用jQuery了,有些同学在享受爽快淋漓coding时就将性能问题忽略了, 比如我. jquer ...
- 跳转时候提示Attempt to present on while a presentation is in progress
出现这种情况,例如:我在获取相册图片后,直接present到另一个页面,但是上一个页面可能还未dismiss,所以,要在获取相册图片的dismiss方法的complete的block里面写获取图片及跳 ...
- emmet 系列(1)基础语法
emmet 系列(1)基础语法 emmet 是一个能显著提升开发html和css开发效率的web开发者工具 emmet基本上目前已知的编辑器都有相应的插件,各个编辑器的emmet插件的下载地址:点我下 ...
- Java中一些常用的方法
1.计算程序运行时常 long start = System.currentTimeMillis(); … … … long end = System.currentTimeMillis(); Sys ...
- SQL SERVER 数据库各版本功能对比
以前写了篇SQL SERVER 2008数据库各版本功能对比,官网提供的那个功能确实很好很强大,后面发现那个链接失效了.今天又遇到要对比SQL Server 2014数据库版本功能需求,搜索找了好久才 ...
- mysql插入多条数据时间复杂度比较
SQL脚本 select * from users; 方式一: insert into users(name, age, course_id) VALUES("test",1, & ...
- XSS 防御方法总结
1. XSS攻击原理 XSS原称为CSS(Cross-Site Scripting),因为和层叠样式表(Cascading Style Sheets)重名,所以改称为XSS(X一般有未知的含义,还有扩 ...
- x86开启 HUGEPAGES
HugePage,就是指的大页内存管理方式,在操作系统Linux环境中,内存是以页Page的方式进行分配,默认大小为4K,HugePage是传统4K Page的替代方案.顾名思义,是用HugePage ...