【UOJ UNR #1】火车管理
来自FallDream的博客,未经允许,请勿转载,谢谢。
考虑用可持久化线段树直接维护每个点在不同时刻,第一辆车的编号。
这样3操作就变成了区间赋值,1操作变成区间和
2操作的话,只需要查询一下现在这辆车的编号,再到历史版本去查一下上一辆车的编号就行了。
#include<iostream>
#include<cstdio>
#define MN 500000
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,ty,rt[MN+],cnt=,num[MN+];
struct Tree{
int l,r,sum,val;
}T[MN*];
inline int newnode(int x,int flag=){if(flag)return x;T[++cnt]=T[x];return cnt;}
inline void Mark(int x,int len,int v){T[x].val=v;T[x].sum=len*num[v];}
inline void pushdown(int x,int lt,int rt)
{
int mid=lt+rt>>;
Mark(T[x].l=newnode(T[x].l),mid-lt+,T[x].val);Mark(T[x].r=newnode(T[x].r),rt-mid,T[x].val);T[x].val=;
} int Build(int l,int r)
{
int x=++cnt;
if(l!=r) T[x].l=Build(l,l+r>>),T[x].r=Build((l+r>>)+,r);
return x;
} int Query(int x,int l,int r,int lt,int rt)
{
if(l==lt&&r==rt) return T[x].sum;int mid=lt+rt>>;
if(T[x].val) pushdown(x,lt,rt);
if(r<=mid) return Query(T[x].l,l,r,lt,mid);
else if(l>mid) return Query(T[x].r,l,r,mid+,rt);
else return Query(T[x].l,l,mid,lt,mid)+Query(T[x].r,mid+,r,mid+,rt);
} int Query(int x,int k,int lt,int rt)
{
if(lt==rt) return T[x].val;int mid=lt+rt>>;
if(T[x].val) pushdown(x,lt,rt);
if(k>mid) return Query(T[x].r,k,mid+,rt);
else return Query(T[x].l,k,lt,mid);
} void Modify(int x,int l,int r,int lt,int rt,int v)
{
if(l==lt&&r==rt) {Mark(x,rt-lt+,v);return;}
int mid=lt+rt>>,flag=T[x].val;
if(T[x].val) pushdown(x,lt,rt);
if(r<=mid) Modify(T[x].l=newnode(T[x].l,flag),l,r,lt,mid,v);
else if(l>mid) Modify(T[x].r=newnode(T[x].r,flag),l,r,mid+,rt,v);
else Modify(T[x].l=newnode(T[x].l,flag),l,mid,lt,mid,v),
Modify(T[x].r=newnode(T[x].r,flag),mid+,r,mid+,rt,v);
T[x].sum=T[T[x].l].sum+T[T[x].r].sum;
}
int last=;
int main()
{
n=read();m=read();ty=read();rt[]=Build(,n);
for(int i=;i<=m;++i)
{
int op=read();rt[i]=newnode(rt[i-]);
if(op==) {int l=(read()+last*ty)%n+,r=(read()+last*ty)%n+;printf("%d\n",last=Query(rt[i],min(l,r),max(l,r),,n));}
if(op==) {int x=(read()+last*ty)%n+,y=Query(rt[i],x,,n);if(y!=) Modify(rt[i],x,x,,n,Query(rt[y-],x,,n));}
if(op==) {int l=(read()+last*ty)%n+,r=(read()+last*ty)%n+;num[i]=read();Modify(rt[i],min(l,r),max(l,r),,n,i);}
}
return ;
}
【UOJ UNR #1】火车管理的更多相关文章
- UNR #1 火车管理
很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...
- 【UNR #1】火车管理
题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...
- 【UNR #1】火车管理(主席树)
[UNR #1]火车管理(主席树) 好好的代码被 \(extra\ test\) 卡常了...我就放一个目前最快的版本吧... 题意简化: 有 \(n\) 个栈,\(m\) 次操作. 将 \(x\) ...
- 「UOJ218」火车管理
「UOJ218」火车管理 解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可 ...
- UOJ#218. 【UNR #1】火车管理 线段树 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...
- UOJ #218. 【UNR #1】火车管理
Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...
- 【UOJ UNR #1】火车管理 可持久化线段树
用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...
- Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维
Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...
- UOJ 218 火车管理
http://uoj.ac/problem/218 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...
随机推荐
- Lucene 的索引文件锁原理
Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene 环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...
- 如何用tomcat实现类似weblogic那样的热部署方式
平时weblogic部署程序包时一般是到控制台去部署,不需要重启. 相反之前用tomcat部署应用时,我一般都是把tomcat重启来完成程序包的更新或新包部署.但是这次要部署的应用有点多,大概10几个 ...
- git cherry-pick 整理
git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并, ...
- LeetCode & Q283-Move Zeroes-Easy
Array Two Pointers Description: Given an array nums, write a function to move all 0's to the end of ...
- Python基础学习篇章三
一. Python对象类型 1. 对象是Python最基本的概念,一个Python程序可以分解为模块.语句.表达式.和对象.它们的关系如下:(1)程序由模块构成 (2)模块包含语句 (3)语句包含表达 ...
- python入门(4)第一个python程序
python入门(4)第一个python程序 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计算结果是不是300: ...
- python 模拟浏览器登陆coursera
import requests import random import string def randomString(length): return ''.join(random.choice(s ...
- Python模块 - os , sys.shutil
os 模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录: ...
- CSS属性操作
CSS属性操作 1 属性选择器 Elenment(元素) E[att] 匹配所有具有att属性的E元素,不考虑它的值.(注意:E在此处可以省略)(推荐使用) 例如:[po]{ font-size: 5 ...
- uva 11636 Hello World!
https://vjudge.net/problem/UVA-11636 题意: 希望输出n条语句,但是并不会循环,所以只能复制粘贴,一条语句经过复制粘贴后可以变为2条,2条变成4条....每次可以只 ...