「UOJ218」火车管理
「UOJ218」火车管理
解题思路:观察发现,在弹出 \(x\) 之前,它前面这个元素都是保持不变的,所以可以用一棵可持久化线段树维护每一个栈顶元素的插入时间,每次找到当前时间\(-1\) 的版本就可以查到栈顶,另外用一棵线段树维护区间答案即可,复杂度 \(O(m\log n)\)
/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 500005;
int q[N], rt[N], n, m, ty, tim, op, l, r, x;
#define fi first
#define se second
inline pair<int, int> chkmax(pair<int, int> A, pair<int, int> B){
return A.fi > B.fi ? A : B;
}
#define mid ((l + r) >> 1)
namespace Tim{
int lc[N*25*25], rc[N*25*25], size; pair<int, int> tag[N*25*25];
inline int copynode(int x){
return lc[++size] = lc[x], rc[size] = rc[x], tag[size] = tag[x], size;
}
inline void ins(int &u, int pr, int l, int r, int L, int R, pair<int, int> x){
u = copynode(pr);
if(l >= L && r <= R) return (void) (tag[u] = x);
if(L <= mid) ins(lc[u], lc[pr], l, mid, L, R, x);
if(mid < R) ins(rc[u], rc[pr], mid + 1, r, L, R, x);
}
inline pair<int, int> query(int u, int l, int r, int pos){
if(l == r) return tag[u];
if(pos <= mid) return chkmax(tag[u], query(lc[u], l, mid, pos));
else return chkmax(tag[u], query(rc[u], mid + 1, r, pos));
}
}
namespace Seg{
#define lson (u << 1)
#define rson (u << 1 | 1)
int s[N<<2], tag[N<<2];
inline void pushdown(int u, int l, int r){
if(!tag[u]) return;
s[lson] = (mid - l + 1) * tag[u], tag[lson] = tag[u];
s[rson] = (r - mid) * tag[u], tag[rson] = tag[u], tag[u] = 0;
}
inline void change(int u, int l, int r, int L, int R, int x){
if(l >= L && r <= R) return (void) (tag[u] = x, s[u] = (r - l + 1) * x);
pushdown(u, l, r);
if(L <= mid) change(lson, l, mid, L, R, x);
if(mid < R) change(rson, mid + 1, r, L, R, x);
s[u] = s[lson] + s[rson];
}
inline int query(int u, int l, int r, int L, int R){
if(l >= L && r <= R) return s[u];
int res = 0; pushdown(u, l, r);
if(L <= mid) res += query(lson, l, mid, L, R);
if(mid < R) res += query(rson, mid + 1, r, L, R);
return res;
}
}
int main(){
read(n), read(m), read(ty); int lastans = 0;
while(m--){
read(op);
if(op == 1){
read(l), read(r);
l = (l + lastans * ty) % n + 1, r = (r + lastans * ty) % n + 1;
if(l > r) swap(l, r);
printf("%d\n", lastans = Seg::query(1, 1, n, l, r));
}
if(op == 2){
read(l), l = (l + lastans * ty) % n + 1;
pair<int, int> now = Tim::query(rt[tim], 1, n, l);
if(!now.se) continue;
pair<int, int> tmp = Tim::query(rt[now.se-1], 1, n, l);
Seg::change(1, 1, n, l, l, q[tmp.se]);
++tim;
Tim::ins(rt[tim], rt[tim-1], 1, n, l, l, make_pair(tim, tmp.se));
}
if(op == 3){
read(l), read(r), read(x);
l = (l + lastans * ty) % n + 1, r = (r + lastans * ty) % n + 1;
if(l > r) swap(l, r);
q[++tim] = x;
Seg::change(1, 1, n, l, r, q[tim]);
Tim::ins(rt[tim], rt[tim-1], 1, n, l, r, make_pair(tim, tim));
}
}
return 0;
}
「UOJ218」火车管理的更多相关文章
- 「OC」内存管理
一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空 ...
- 「NOI2015」「Codevs4621」软件包管理器(树链剖分
4621 [NOI2015]软件包管理器 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对 ...
- 【LOJ】 #2130. 「NOI2015」软件包管理器
题解 连树剖我都写跪一次,我现在怎么那么老年啊= = 简直滚粗预定了啊.. 我们线段树维护树剖只需要资瓷区间覆盖和区间求和就好了 安装的时候看看自己到根有多少包装了,dep减去这个数量就好 卸载的时候 ...
- LibreOJ #2130. 「NOI2015」软件包管理器
内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名 树链剖分+线段树 屠龙宝刀点击就送 #include <vector> ...
- 「NOI2015」软件包管理器
题目描述 题面比较啰唆,我先把大体意思讲一下: 首先,有编号从\(0\)到\(N-1\)的\(N\)个节点,根节点一定是\(0\)号节点(无前驱) (我把下标都加上了一,转化为以\(1\)为起始下标的 ...
- 「LOJ#10034」「一本通 2.1 例 2」图书管理 (map
题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. 该系统需 ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 一个只需要点 「下一步」就完成监控 Windows
Cloud Insight 此前已然支持 Linux 操作系统,支持20多中数据库中间件等组件,多种操作,多种搭配,服务器监控玩的其乐无穷啊!但想想还有许多 Windows 的小伙伴没有体验过,所以在 ...
随机推荐
- 【NOIP】提高组2013 货车运输
[算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...
- 二进制、十进制、十六进制(python)
int(“x”,base=2/8/16)是把x都转换成十进制 二进制: 1111=1*2的3次方+1*2的2次方+1*2的1次方+1*2的0次方 =8+4+2+1=15 1000=1*2的3次方+0 ...
- isolation forest进行异常点检测
一.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择.在建树过程中, ...
- Perl6多线程4: Promise allof / anyof
allof : 所有代码块执行完成后才退出 anyof :只要有一个代码块执行完后就马上退出 要配合 await 一起用: my $p = start {say 'a'}; ;say 'b';} ...
- lspci 虚拟机网卡对应关系
我这个办法有点笨: 到 /sys/devices/ 下去搜索网卡 eth*,找到网卡对应的PCI 总线位置,例如:05:00.0. 然后通过 "lspci -s 05:00.0" ...
- Deep Learning基础--机器翻译BLEU与Perplexity详解
前言 近年来,在自然语言研究领域中,评测问题越来越受到广泛的重视,可以说,评测是整个自然语言领域最核心和关键的部分.而机器翻译评价对于机器翻译的研究和发展具有重要意义:机器翻译系统的开发者可以通过评测 ...
- SPOJ DQUERY D-query (在线主席树/ 离线树状数组)
版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...
- List基本用法
List最为Collection接口的子接口,当然可以使用Collection接口里的全部方法.而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法: public c ...
- 设计模式--工厂模式 caffe_layer注册
来源:http://www.cnblogs.com/zhouqiang/archive/2012/07/20/2601365.html 来源:http://blog.luoyetx.com/2016/ ...
- python抓取链家房源信息(三)
之前写过一个链家网北京二手房的数据抓取,然后本来今天想着要把所有的东西弄完,但是临时有事出去了一趟,耽搁了一下,然后现在是想着把北京的二手房的信息都进行抓取,并且存储在mongodb中, 首先是通过' ...