[UOJ218]火车管理
建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间
询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖
以前一直没写过可持久化线段树的区间覆盖,这里记一下
这题只用单点查询,我们在修改时把对应的区间打上标记并将其儿子设为空,那么单点查询时答案就是访问到的最深的存在的节点
维护区间和也是可以的,直接pushdown,只不过只用对存在的儿子pushdown,在pushup时不存在的儿子的值就是当前节点的标记了
#include<stdio.h> #include<algorithm> using namespace std; char c[20000010]; int ns; #define NUM(x) ('0'<=x&&x<='9') int rd(){ while(!NUM(c[ns]))ns++; int x=0; while(NUM(c[ns]))x=x*10+c[ns++]-'0'; return x; } int n; struct pseg{ struct seg{ int l,r,v; }t[40000010]; int rt[5000010],M; void modify(int pr,int&nr,int L,int R,int v,int l,int r){ t[nr=++M]=t[pr]; if(L<=l&&r<=R){ t[nr].v=v; t[nr].l=t[nr].r=0; return; } int mid=(l+r)>>1; if(L<=mid)modify(t[pr].l,t[nr].l,L,R,v,l,mid); if(mid<R)modify(t[pr].r,t[nr].r,L,R,v,mid+1,r); } int query(int p,int l,int r,int x){ if(x==0)return-1; int mid=(l+r)>>1,res; if(p<=mid) res=query(p,l,mid,t[x].l); else res=query(p,mid+1,r,t[x].r); return~res?res:t[x].v; } void modify(int t,int l,int r,int v){ modify(rt[t],rt[t],l,r,v,1,n); } int query(int t,int p){ return query(p,1,n,rt[t]); } }top,in; int s[2000010],t[2000010]; void gao(int x,int len,int v){ t[x]=v; s[x]=len*v; } void pushdown(int x,int ln,int rn){ if(t[x]){ gao(x<<1,ln,t[x]); gao(x<<1|1,rn,t[x]); t[x]=0; } } void pushup(int x){s[x]=s[x<<1]+s[x<<1|1];} void modify(int L,int R,int v,int l,int r,int x){ if(L<=l&&r<=R)return gao(x,r-l+1,v); int mid=(l+r)>>1; pushdown(x,mid-l+1,r-mid); if(L<=mid)modify(L,R,v,l,mid,x<<1); if(mid<R)modify(L,R,v,mid+1,r,x<<1|1); pushup(x); } int query(int L,int R,int l,int r,int x){ if(L<=l&&r<=R)return s[x]; int mid=(l+r)>>1,s=0; pushdown(x,mid-l+1,r-mid); if(L<=mid)s+=query(L,R,l,mid,x<<1); if(mid<R)s+=query(L,R,mid+1,r,x<<1|1); return s; } int main(){ fread(c,1,20000010,stdin); in.t[0].v=-1; top.t[0].v=-1; int m,on,las,op,i,l,r,x,v; n=rd(); m=rd(); on=rd(); las=0; for(i=1;i<=m;i++){ top.rt[i]=top.rt[i-1]; in.rt[i]=in.rt[i-1]; op=rd(); if(op==1){ l=(rd()+on*las)%n+1; r=(rd()+on*las)%n+1; if(l>r)swap(l,r); las=query(l,r,1,n,1); printf("%d\n",las); } if(op==2){ l=(rd()+on*las)%n+1; x=in.query(i,l); if(x>0){ v=in.query(x-1,l); if(v==-1)v=0; in.modify(i,l,l,v); v=top.query(x-1,l); if(v==-1)v=0; modify(l,l,v,1,n,1); top.modify(i,l,l,v); } } if(op==3){ l=(rd()+on*las)%n+1; r=(rd()+on*las)%n+1; x=rd(); if(l>r)swap(l,r); modify(l,r,x,1,n,1); top.modify(i,l,r,x); in.modify(i,l,r,i); } } }
[UOJ218]火车管理的更多相关文章
- 「UOJ218」火车管理
「UOJ218」火车管理 解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可 ...
- 【UNR #1】火车管理(主席树)
[UNR #1]火车管理(主席树) 好好的代码被 \(extra\ test\) 卡常了...我就放一个目前最快的版本吧... 题意简化: 有 \(n\) 个栈,\(m\) 次操作. 将 \(x\) ...
- 【UNR #1】火车管理
题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...
- UOJ 218 火车管理
http://uoj.ac/problem/218 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...
- UOJ#218. 【UNR #1】火车管理 线段树 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...
- 【UOJ UNR #1】火车管理
来自FallDream的博客,未经允许,请勿转载,谢谢. 题面 考虑用可持久化线段树直接维护每个点在不同时刻,第一辆车的编号. 这样3操作就变成了区间赋值,1操作变成区间和 2操作的话,只需要查询一下 ...
- UOJ #218. 【UNR #1】火车管理
Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...
- 【UOJ UNR #1】火车管理 可持久化线段树
用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...
- UNR #1 火车管理
很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...
随机推荐
- 超详细的Java面试题总结(三)之Java集合篇常见问题
List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...
- dot.js使用心得
一.dot.js介绍 最近用到的数据模板引擎有很多,今天讲的doT.js也是其中一种. doT.js的特点是体积小,速度快,并且不依赖其他插件. 官网下载:http://olado.github.io ...
- vs调试 配置IISExpress允许局域网内部访问
内网可访问后,本机不能使用localhost 1.找到IISExpress的配置文件,位于 <文档>/IISExpress/config文件夹下,打开applicationhost.c ...
- jeecg3.7中弹出窗操作标签dgOpenOpt的用法
1.基本参数 参数名 描述 url 弹出页面地址 title ...
- 广度优先算法(BFS)与深度优先算法(DFS)
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
- Linux后台研发面试题
本系列给出了在复习过程中一些C++后台相关面试题,回答内容按照笔者的知识点掌握,故有些问题回答较为简略 1.信号的生命周期 一个完整的信号生命周期可以用四个事件刻画:1)信号诞生:2)信号在进程中注册 ...
- 3D Studio Max [www]
https://github.com/RealityFactory/Exporters https://github.com/code-google-com/3ds-max-dev https://g ...
- 81.Search in Rotated Sorted Array II---二分变形
题目链接 题目大意:与33题类似,只是这里数组中有重复数值. 法一:解法与33题类似,只是这里要处理1,3,1,1,1这种情况,即有重复值时,mid与left和right都相等时,可以采用right- ...
- UVALive 7040 Color
题目链接:LA-7040 题意为用m种颜色给n个格子染色.问正好使用k种颜色的方案有多少. 首先很容易想到的是\( k * (k-1)^{n-1}\),这个算出来的是使用小于等于k种颜色给n个方格染色 ...
- 苹果电脑Mac OS系统重装图文详解
苹果电脑Mac OS系统重装图文详解 本文来自于[系统之家] www.xp85.com现在电脑都很强大,可是也很脆弱,常常需要你去维护,甚至经常需要你重装系统,那么Mac OS又如何重装系统呢?刚刚使 ...