UNR #1 火车管理
很简单
用一个线段树维护
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 火车管理的更多相关文章
- 【UNR #1】火车管理(主席树)
[UNR #1]火车管理(主席树) 好好的代码被 \(extra\ test\) 卡常了...我就放一个目前最快的版本吧... 题意简化: 有 \(n\) 个栈,\(m\) 次操作. 将 \(x\) ...
- 「UOJ218」火车管理
「UOJ218」火车管理 解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可 ...
- 【UNR #1】火车管理
题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...
- 【UOJ UNR #1】火车管理
来自FallDream的博客,未经允许,请勿转载,谢谢. 题面 考虑用可持久化线段树直接维护每个点在不同时刻,第一辆车的编号. 这样3操作就变成了区间赋值,1操作变成区间和 2操作的话,只需要查询一下 ...
- 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 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...
随机推荐
- 分区容量大于16TB的格式化
File systems do have limits. Thats no surprise. ext3 had a limit at 16 TB file system size. If you n ...
- XFire Web Service客户端开发
一.项目创建: 创建一个Maven的web工程 Maven包导入pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...
- TOML简介 (转)
TOML的由来 配置文件的使用由来已久,从.ini.XML.JSON.YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升. TOML是前GitHub CEO, Tom Prest ...
- git for windows 无法结束node进程(windows下杀进程)
问题 windows 系统下,如果用CMD命令行启动node服务,Ctrl + C 即可结束命令 git bash 用起来比命令行方便,但是Ctrl + C 并不会结束node服务,再次启动会报如下错 ...
- 点击textbox弹出对话框,返回弹出对话框的值
主要是在父页面使用 function PopupWindow() { window.open(url, "", "status=no,resizab ...
- SPOJ LCS2 - Longest Common Substring II 后缀自动机 多个串的LCS
LCS2 - Longest Common Substring II no tags A string is finite sequence of characters over a non-emp ...
- springcloud微服务实战--笔记--1、基础知识
微服务的问题: 分布式事务和数据一致性. 由于分布式事务本身第实现难度就非常大,所以在微服务架构中,我们更强调在各服务之间进行无事务第调用,而对于数据一致性,只要求数据在最后第处理状态是一致第即可:若 ...
- Linux 设置mysql开机启动
linux开启启动的程序一般放在/etc/rc.d/init.d/里面,/etc/init.d/是其软连接 mysql设为linux服务 cp /usr/local/mysql/support-fil ...
- toggle不支持事件代理的解决办法或者 jquery live绑定toggle
$(".xxx").live("click", function () { $(this).toggle(function () {},functio ...
- abap 数字移动小游戏
[转自 http://blog.csdn.net/forever_crazy/article/details/6542507] report ...... selection-screen pushb ...