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]火车管理
建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...
随机推荐
- SpringBoot 配置文件 application.properties
转:http://www.qiyadeng.com/post/spring-boot-application-properties #########COMMON SPRING BOOT PROPER ...
- Linux用户与用户组的详解
1,用户和用户组文件 在linux中,用户帐号,用户密码,用户组信息和用户组密码均是存放在不同的配置文件中的. 在linux系统中,所创建的用户帐号和其相关信息(密码除外)均是存放在/etc/ ...
- listview 遇到问题java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
开发的时候 遇到 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 这个异常有时候会有,有时候正常 不太好捕捉 猜测 已经 ...
- android——api
一.1.复用首页做法—从Intent中获取”com.example.android.apis.Path”.根据这个结合PackageManger获得的Activities来展示不同等级的List界面( ...
- Android自动化测试之monkeyrunner工具
一.什么是monkeyrunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monkeyrunner,您可以 ...
- linux下显卡信息的查看
lspci | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...
- Effective C++ 总结(一)
一.让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言: C.说到底C++仍是以C为基础.区块,语句,预处理器,内置数据类型, ...
- Linux下有线无线网络配置------命令模式
1. 列出启用网络设备的所有信息: ifconfig 2. 将网络设备设置为启用或者不启用 不启用设备eth0 ifconfig eth0 down 启用设备eth0: Will bring eth0 ...
- 一行代码实现iOS序列化与反序列化
一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...
- 使用HTML5 WebDataBase设计离线数据库
基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离 ...