很简单

用一个线段树维护

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. 提升Web性能的技巧

    1.  采用反向代理服务器(Reverse Proxy Server)来对应用进行加速和保护 其作用主要在以下三方面: 负载平衡 – 运行在反向代理服务器上的负载平衡器会在不同的不服务器  间进行传输 ...

  2. hdu5386(暴力)

    题意: 给出两个n*n的矩阵,一个作为初始矩阵.一个作为目标矩阵,给出m个操作,操作有两种,一种是"L,x,y".代表我们要把x这一行赋成y,还有一种是"H,x,y&qu ...

  3. ubuntu16.04 Cmake学习二

    本节主要总结编译程序的时候使用了第三方库的情况,以调用开源opencv-2.4.9为例子,具体安装详见http://www.cnblogs.com/xsfmg/p/5900420.html. 工程文件 ...

  4. wifi认证Portal开发系列(四):portal协议的java封装

     一.报文封装类 AbstractPortalMsg.java Portal协议数据报文封装类 package org.yoki.edu.common.protocol.portal.msg; imp ...

  5. jQuery Validate(二)

    刚刚试了所谓的新版的用法.千万别问我是多新,因为我也不知道... <!DOCTYPE html> <html> <head> <script src=&quo ...

  6. 【WPF学习笔记】之如何保存画面上新建的数据到数据库中并且删除画面上的数据和数据库的数据:动画系列之(五)

    ...... 承接系列四后续: 首先,我要在用户控件2中添加“保存”,“删除”按钮. XAML代码: <UserControl x:Class="User.uc_item" ...

  7. Java泛型【转】

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  8. EasyNVR H5无插件摄像机直播解决方案前端解析之:videojs的使用

    video.js的基本使用方法 一.videojs的初始化加载 videojs初始化加载分为两中 1.标签式加载 在引入videojs加载文件的前提下,可以在video标签中添加属性值"da ...

  9. Servlet单例模式(注意)

    package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax ...

  10. 九度OJ 1006:ZOJ问题 (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:18621 解决:3197 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下: 1. ...