UOJ 218 火车管理
http://uoj.ac/problem/218
思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案。
如果询问,直接询问线段树。
如果区间压入,直接在主席树上面压入,然后更新线段树答案
如果弹出,那么直接找主席树当前位之前的火车是那辆,然后修改线段树答案,再修改当前主席树答案。
改题的时候蜜汁错误。。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
int tr[],ls[],tag[],rs[];
int tg[],sum[],sz,rt[],a[];
int n,m,ty;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void pushdown(int k){
if (tag[k]==-) return;
if (!ls[k]) ls[k]=++sz;
if (!rs[k]) rs[k]=++sz;
tag[ls[k]]=tag[rs[k]]=tr[ls[k]]=tr[rs[k]]=tag[k];
tag[k]=-;
}
void add(int &k,int kk,int l,int r,int x,int y,int v){
k=++sz;tag[k]=-;
if (x==l&&r==y){
tag[k]=tr[k]=v;
return;
}
pushdown(kk);
int mid=(l+r)>>;
ls[k]=ls[kk];rs[k]=rs[kk];
if (y<=mid) add(ls[k],ls[kk],l,mid,x,y,v);
else
if (x>mid) add(rs[k],rs[kk],mid+,r,x,y,v);
else
add(ls[k],ls[kk],l,mid,x,mid,v),add(rs[k],rs[kk],mid+,r,mid+,y,v);
}
int query(int k,int l,int r,int pos){
if (!k||l==r) return tr[k];
pushdown(k);
int mid=(l+r)>>;
if (pos<=mid) return query(ls[k],l,mid,pos);
else return query(rs[k],mid+,r,pos);
}
void pushdown(int k,int l,int r){
if (tg[k]==-||l==r) return;
tg[k*]=tg[k*+]=tg[k];
int mid=(l+r)>>;
sum[k*]=tg[k]*(mid-l+);
sum[k*+]=tg[k]*(r-mid);
tg[k]=-;
}
void modify(int k,int l,int r,int x,int y,int v){
pushdown(k,l,r);
if (x==l&&r==y){
tg[k]=v;sum[k]=(r-l+)*v;
pushdown(k,l,r);
return;
}
int mid=(l+r)>>;
if (y<=mid) modify(k*,l,mid,x,y,v);
else
if (x>mid) modify(k*+,mid+,r,x,y,v);
else modify(k*,l,mid,x,mid,v),modify(k*+,mid+,r,mid+,y,v);
sum[k]=sum[k*]+sum[k*+];
}
int getsum(int k,int l,int r,int x,int y){
pushdown(k,l,r);
if (x==l&&r==y){
return sum[k];
}
int mid=(l+r)>>,z=;
if (y<=mid) return getsum(k*,l,mid,x,y);
else
if (x>mid) return getsum(k*+,mid+,r,x,y);
else return getsum(k*,l,mid,x,mid)+getsum(k*+,mid+,r,mid+,y);
}
int main(){
n=read();m=read();ty=read();
int ans=;
for (int i=;i<=m;i++){
rt[i]=rt[i-];
int opt=read(),l=read();l=(l+ty*ans)%n+;
if (opt==){
int x=query(rt[i],,n,l);
if (x){
int y=query(rt[x-],,n,l);
add(rt[i],rt[i],,n,l,l,y);
modify(,,n,l,l,a[y]);
}
continue;
}
int r=read();r=(r+ty*ans)%n+;
if (l>r) std::swap(l,r);
if (opt==){printf("%d\n",ans=getsum(,,n,l,r));}
else{
a[i]=read();
add(rt[i],rt[i],,n,l,r,i);
modify(,,n,l,r,a[i]);
}
}
return ;
}
UOJ 218 火车管理的更多相关文章
- 【UNR #1】火车管理(主席树)
[UNR #1]火车管理(主席树) 好好的代码被 \(extra\ test\) 卡常了...我就放一个目前最快的版本吧... 题意简化: 有 \(n\) 个栈,\(m\) 次操作. 将 \(x\) ...
- 「UOJ218」火车管理
「UOJ218」火车管理 解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可 ...
- UOJ#218. 【UNR #1】火车管理 线段树 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...
- UOJ #218. 【UNR #1】火车管理
Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...
- Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维
Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...
- 【UOJ UNR #1】火车管理
来自FallDream的博客,未经允许,请勿转载,谢谢. 题面 考虑用可持久化线段树直接维护每个点在不同时刻,第一辆车的编号. 这样3操作就变成了区间赋值,1操作变成区间和 2操作的话,只需要查询一下 ...
- 【UOJ UNR #1】火车管理 可持久化线段树
用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...
- 【UNR #1】火车管理
题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...
- [UOJ218]火车管理
建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...
随机推荐
- 004_Eclipse编写第一个Java_Web程序
1.MyEclipse的菜单栏--File--Web Project,新建一个web工程 Project name 填上自己的项目名称,例如HelloWorld. 需要选择Java EE版本以及Tar ...
- .mtl文件格式解析
最近在导入下载的.OBJ文件,有时会出现只有模型而没有材质渲染的情况.难道材质要自己一点一点重新赋予?抓狂……我知道.OBJ文件用来存储模型信息,观察第一行代码,可以看到材质库文件为mtllib ## ...
- iOS国际化支持
写给自己看: 1.先创建一个国际化文件,用于描述在不同的区域环境,显示不同的value.文件名必须是Localizable.strings,文件的内容稍后再写.
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- The following module was built either with optimizations enabled or witherout debug information
出现这个问题的原因是这个程式有做版控,服务器上的版本比本机版本小 解决方式为:删除服务器上的版控或者本机版本改成与服务器一致即可
- Android中的缓存机制与实现
分步阅读 Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android ...
- retrofit2 使用教程 及 Android 网络架构搭建 (原创)
squareup 推出 retrofit2 已经有一段时间了,现在的版本比较稳定,没有什么大坑了.网络上的教程要么太简单,只是个Demo:要么有些落时,要么复用性比较差,所以自己写个教程,供大家参考. ...
- 第一章 Javascript基础
一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAscipt. d.特 ...
- java测试1
发大水 package com.java1234.activiti.variable; import java.util.Date; import java.util.HashMap; import ...
- Chrome扩展与用户隐私
转载自https://www.imququ.com/post/chrome-extensions-and-user-privacy.html Google Chrome浏览器应该早就是大家的默认了 ...