来自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】火车管理的更多相关文章

  1. UNR #1 火车管理

    很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...

  2. 【UNR #1】火车管理

    题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...

  3. 【UNR #1】火车管理(主席树)

    [UNR #1]火车管理(主席树) 好好的代码被 \(extra\ test\) 卡常了...我就放一个目前最快的版本吧... 题意简化: 有 \(n\) 个栈,\(m\) 次操作. 将 \(x\) ...

  4. 「UOJ218」火车管理

    「UOJ218」火车管理 解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可 ...

  5. UOJ#218. 【UNR #1】火车管理 线段树 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...

  6. UOJ #218. 【UNR #1】火车管理

    Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...

  7. 【UOJ UNR #1】火车管理 可持久化线段树

    用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...

  8. Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维

    Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...

  9. UOJ 218 火车管理

    http://uoj.ac/problem/218 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...

随机推荐

  1. 申请JetBrains学生免费注册码

    1.申请.edu.*后缀的邮箱 从某个知乎用户上面得到了两个可以申请的后缀edu的邮箱 上海交通大学校友统一身份认证:https://register.alumni.sjtu.edu.cn/alumn ...

  2. JAVA_SE基础——24.面向对象的内存分析

    黑马程序员入学blog ... 接着上一章的代码: //车类 class Car{ //事物的公共属性使用成员变量描述. String name; //名字的属性 String color; //颜色 ...

  3. 2-51单片机WIFI学习(开发板测试远程通信详细介绍)

    前一篇链接(最后有APP安装包下载地址) http://www.cnblogs.com/yangfengwu/p/8720148.html 由于自己别的贴片的板子还没到,所以用自己的8266最小系统板 ...

  4. jquery ajax file upload NET MVC 无刷新文件上传

    网上有各种各样的文件上传方法,有基于JS框架的.也有基于flash swf插件的. 这次分享一个比较简单而且实用能快速上手的文件上传方法,主要步骤: 1.引用Jquery包,我用的是jquery-1. ...

  5. build.gradle & gradle.properties

    一.build.gradle buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { maven { cred ...

  6. 百度播放器SDK 播放MP4格式视频有声音无画面问题解决

    此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...

  7. DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题

    问题描述 如下一个实体类,含有非空时间类型属性,默认是C#的最小时间,在使用DataContractJsonSerializer将该类对象序列化成JSON时,抛出异常信息:System.Runtime ...

  8. 【转】python3 urllib.request 网络请求操作

    python3 urllib.request 网络请求操作 基本的网络请求示例 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' im ...

  9. Java - Spring MVC 实现跨域资源 CORS 请求

    拦截器设置响应头 这种方式原理就是利用拦截器在方法执行前,我们增加请求的响应头,用来支持跨域请求.这种方案是可行的,大部分都是采用这种方案.我当时也是打算采用这种方案,直到我发现原来 Spring 框 ...

  10. 完成 bass 库的频谱显示效果图

    效果如图所示,比 bass 官方自带的例子效果要好那么一点点(峰值有滞留)...