【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 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...
随机推荐
- Django 个性化管理员站点
from django.contrib import admin # Register your models here. from .models import Moment class Momen ...
- hashlib 加密
import hashlib def md5(args): hash = hashlib.md5(bytes('aaadf',encoding='utf-8')) hash.update(bytes( ...
- 大数据技术Hadoop笔试题
Hadoop有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.以下是由应届毕业生网小编J.L为您整理推荐的面试笔试题目和经验,欢迎参考阅读. 单项选择题 1. 下面哪个程序负责 H ...
- vue-router 组件实例被复用问题
最近在开发过程中遇到如下问题: 当前路由是这样的 http://127.0.0.1:3010/order?keywords=22 只改变keywords的值,路由不跳转 http://127.0.0. ...
- Docker学习笔记 - Docker的数据卷
一.什么是数据卷? 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数据 ...
- Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...
- centos7配置Apache支持HTTPS
Apache版本2.4 安装mod_ssl yum install mod_ssl 建立文件夹,存放sslkey mkdir /etc/httpd/ssl/ 建立凭证档 openssl req -x5 ...
- Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布 摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导 ...
- jacascript document对象
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! Document 类型表示文档,或文档的根节点,这个节点是隐藏的,没有具体的节点标签:而 html 是根标 ...
- [LeetCode] Base 7 基数七
Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...