很简单

用一个线段树维护

1.答案

2.当前栈顶是什么时候push进来的

然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个

就可以了

询问直接在线段树上询问,修改在两棵树上分别修改即可

调一年

//wls niubi!
#include<bits/stdc++.h>
#define LL long long
using namespace std;
inline int read()
{
int x = ,f = ;char ch = getchar();
for(;!isdigit(ch);ch = getchar())if(ch == '-')f = -f;
for(;isdigit(ch);ch = getchar())x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n,m,ty,rt;
int tot;
int dfn,root[maxn],ls[maxn << ],rs[maxn << ],val[maxn << ],tag[maxn << ],w[maxn];
inline void pushdown(int x,int l,int r)
{
if(l == r || !tag[x])return;
int t = tag[x],mid = (l + r) >> ;tag[x] = ;
if(!ls[x])ls[x] = ++dfn;
if(!rs[x])rs[x] = ++dfn;
tag[ls[x]] = tag[rs[x]] = t;
val[ls[x]] = w[t] * (mid - l + );
val[rs[x]] = w[t] * (r - mid);
}
inline int query(int x,int l,int r,int L,int R)
{
if(!x)return ;
pushdown(x,l,r);
if(L <= l && r <= R)return val[x];
int mid = (l + r) >> ,ans = ;
if(L <= mid)ans += query(ls[x],l,mid,L,R);
if(R > mid)ans += query(rs[x],mid + ,r,L,R);
return ans;/*
if(R <= mid)return query(ls[x],l,mid,L,R);
else if(L > mid)return query(rs[x],mid + 1,r,L,R);
else return query(ls[x],l,mid,L,R) + query(rs[x],mid + 1,r,L,R);*/
}
inline int qid_1(int x,int l,int r,int p)
{
if(tag[x])return tag[x];
if(l == r)return tag[x];
int mid = (l + r) >> ;
if(p <= mid)return qid_1(ls[x],l,mid,p);
else return qid_1(rs[x],mid + ,r,p);
}
inline int qid_2(int x,int l,int r,int p)
{
pushdown(x,l,r);
if(l == r)return tag[x];
int mid = (l + r) >> ;
if(p <= mid)return qid_2(ls[x],l,mid,p);
else return qid_2(rs[x],mid + ,r,p);
}
inline void modify(int &x,int l,int r,int L,int R,int va)
{
if(!x)x = ++dfn;
pushdown(x,l,r);
if(L <= l && r <= R)
{
tag[x] = va;
val[x] = (r - l + ) * w[va];
return;
}
int mid = (l + r) >> ;
if(L <= mid)modify(ls[x],l,mid,L,R,va);
if(R > mid)modify(rs[x],mid + ,r,L,R,va);
val[x] = val[ls[x]] + val[rs[x]];
}
inline void Cpushdown(int x)
{
if(!tag[x])return;
int v = tag[x],tmp;tag[x] = ;
tmp = ls[x],ls[x] = ++dfn;ls[ls[x]] = ls[tmp],rs[ls[x]] = rs[tmp],tag[ls[x]] = tag[tmp],val[ls[x]] = val[tmp];
tmp = rs[x],rs[x] = ++dfn;ls[rs[x]] = ls[tmp],rs[rs[x]] = rs[tmp],tag[rs[x]] = tag[tmp],val[rs[x]] = val[tmp];
tag[ls[x]] = tag[rs[x]] = v;
}
inline void insert(int &x,int l,int r,int L,int R,int va,int flg)
{
if(flg)
{
int p = x;
x = ++dfn;
ls[x] = ls[p],rs[x] = rs[p],tag[x] = tag[p],val[x] = val[p];
}
flg = ;
if(l < r && tag[x])Cpushdown(x),flg = ;
if(L <= l && r <= R){tag[x] = va;return;}
int mid = (l + r) >> ;
if(L <= mid)insert(ls[x],l,mid,L,R,va,flg);
if(R > mid)insert(rs[x],mid + ,r,L,R,va,flg);
}
int main()
{
n=read();m=read();ty=read();
int ans=;
while(m--)
{
int op=read();
if (op==)
{
int l=(read()+ans*ty)%n+,r=(read()+ans*ty)%n+;
if (l>r) swap(l,r);
printf("%d\n",ans=query(rt,,n,l,r));
}
else if (op==)
{
int l=(read()+ans*ty)%n+,id=qid_2(rt,,n,l);
id=qid_1(root[id-],,n,l);
modify(rt,,n,l,l,id);
tot++;root[tot]=root[tot-];
insert(root[tot],,n,l,l,id,);
}
else
{
int l=(read()+ans*ty)%n+,r=(read()+ans*ty)%n+,x=read();
if (l>r) swap(l,r);
tot++;w[tot]=x;root[tot]=root[tot-];
insert(root[tot],,n,l,r,tot,);
modify(rt,,n,l,r,tot);
}
}
}

UNR #1 火车管理的更多相关文章

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

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

  2. 「UOJ218」火车管理

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

  3. 【UNR #1】火车管理

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

  4. 【UOJ UNR #1】火车管理

    来自FallDream的博客,未经允许,请勿转载,谢谢. 题面 考虑用可持久化线段树直接维护每个点在不同时刻,第一辆车的编号. 这样3操作就变成了区间赋值,1操作变成区间和 2操作的话,只需要查询一下 ...

  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. gulp 静态资源版本控制

    package.json { "name": "gulp", "version": "0.0.1", "des ...

  2. AI生万物,新世界的大门已敞开

    四月是万物复苏的时节,一年一度的GMIC全球移动互联网大会也在这个时间如期而至,在4月26日-28日的会议期间,有超过三百位行业专家进行了精彩的演讲,更有数万名现场观众感受到思维碰撞迸发出的火花. 作 ...

  3. VSTS跟Kubernetes整合进行CI/CD

    利用VSTS跟Kubernetes整合进行CI/CD   为什么VSTS要搭配Kubernetes? 通常我们在开发管理软件项目的时候都会碰到一个很头痛的问题,就是开发.测试.生产环境不一致,导致开发 ...

  4. Thymeleaf框架

    简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在 ...

  5. PHP进阶知识

    关于PHP程序员技术职业生涯规划:http://rango.swoole.com/ Micro Service Framework For PHP:https://github.com/pinguo/ ...

  6. 获得手机的ip

    本文转载至 http://blog.csdn.net/showhilllee/article/details/8746114      iosip手机 貌似ASI里获取ip地址的链接不可以了.也曾试过 ...

  7. COGS410. [NOI2009] 植物大战僵尸

    410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:pvz.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] Plants vs ...

  8. C#中反射type记录

    写代码的时候经常需要使用反射相关的东西例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA  a; 为例1. 通过typeof(ClassA) 或者 a.Get ...

  9. AWS:2.根设备类型、EC2生命周期状态、User Data

    主要内容 1.根设备类型 linux: /dev/sda1 windows: 系统盘 2.实例生命周期 生命周期状态:停止.终止.重启 3.用户数据(UserData) 实例在初始化,运行之前给定的用 ...

  10. windows系统下nodejs、npm、express的下载和安装教程——2016.11.09

    1. node.js下载 首先进入http://nodejs.org/dist/,这里面的版本呢,几乎每个月都出几个新的,建议大家下载最新版本,看看自己的电脑是多少位的,别下错了. 下载完解压到你想放 ...