很简单

用一个线段树维护

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. EMC机理------串扰

    转:电子工程师不得不知道的EMC机理------串扰(韬略科技EMC) 串扰是信号完整性中最基本的现象之一,在板上走线密度很高时串扰的影响尤其严重.我们知道,线性无缘系统满足叠加定理,如果受害线上有信 ...

  2. HDFS源码分析数据块复制监控线程ReplicationMonitor(一)

    ReplicationMonitor是HDFS中关于数据块复制的监控线程,它的主要作用就是计算DataNode工作,并将复制请求超时的块重新加入到待调度队列.其定义及作为线程核心的run()方法如下: ...

  3. C# 杀掉后台进程

    var p = Process.GetProcessesByName("WINWORD"); if (p.Any()) { for (int i = 0; i < p.Len ...

  4. 【Caffe】利用log文件绘制loss和accuracy(转载)

    (原文地址:http://blog.csdn.net/liuweizj12/article/details/64920428) 在训练过程中画出accuracy 和loss曲线能够更直观的观察网络训练 ...

  5. Android锁屏状态下弹出activity,如新版qq的锁屏消息提示

    在接收消息广播的onReceive里,跳转到你要显示的界面.如: Intent intent = new Intent(arg0,MainActivity.class); intent.addFlag ...

  6. 转载 OSX开发推荐书籍列表

    初级 (开发语言, 开发工具)Objective-C Beginner's GuideObjective-C for Absolute Beginners 2nd EditionLearning Co ...

  7. 【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟

    [BZOJ2457][BeiJing2011]双端队列 Description        Sherry现在碰到了一个棘手的问题,有N个整数需要排序.        Sherry手头能用的工具就是若 ...

  8. rtmp直播拉流客户端EasyRTMPClient TCP窗口大小设计方法

    EasyRTMPClient 简介 EasyRTMPClient是EasyDarwin流媒体团队开发.提供的一套非常稳定.易用.支持重连接的RTMPClient工具,以SDK形式提供,接口调用非常简单 ...

  9. hadoop2.3安装过程及问题解决

    三台serveryiprod01,02,03,当中01为namenode,02为secondarynamenode.3个均为datanode 3台server的这里提到的配置均需一样. 0.安装前提条 ...

  10. Android学习之——优化篇(2)

    一.高级优化     上篇主要从0基础优化的方式,本篇主要将从程序执行性能的角度出发,分析各种经常使用方案的不足.并给出对象池技术.基础数据类型替换法.屏蔽函数计算三种能够节省资源开销和处理器时间的优 ...