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]火车管理
建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...
随机推荐
- url找不到指定位置
刚才遇到了把css装入一个文件夹下,然后有的图片失效了. 后来解决是在.css里把./images 换成 ../images 原来css找图片的地址是基于自身.css文件的位置寻找的,不是以引用它的. ...
- 通配符的匹配很全面, 但无法找到元素 'cache:advice' 的声明
EB-INF\classes\spring-jdbc.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineN ...
- bzoj2049: [Sdoi2008]Cave 洞穴勘测
lct入门题? 得换根了吧TAT 这大概不是很成熟的版本.. #include<iostream> #include<cstring> #include<cstdlib& ...
- [置顶] cocos2d-x 植物大战僵尸(4) 帽子僵尸的产生
大家早上好,趁着阳光美好的时候,我打算写下博客:今天要说的是僵尸的产生了,这块和太阳因子的产生比较相似,大体上的区别在于僵尸的基类这块:我在考虑是详细的写还是大体的写,本着对自己作业的态度和 ...
- Android源代码分析之Framework的MediaPlayer
在Android中MediaPlayer用来播放音频和视频文件,在这里分析下在Framework层中MediaPlayer是怎样调用的.MediaPlayer的代码位于:./frameworks/ba ...
- 警告"Local declaration of 'XXX' hides instance variable"原因
Local declaration of 'XXX' hides instance variable 是因为本地变量名跟函数变量名同名 ,.在命名上要注意.....
- TwoSAT算法模板
该模板来自大白书 [解释] 给多个语句,每个语句为“ Xi为真(假) 或者 Xj为真(假)” 每个变量和拆成两个点 2*i为假, 2*i+1为真 “Xi为真 或 Xj为真” 等价于 “Xi为假 –& ...
- codevs1404字符串匹配
/* 无奈我改了那么久还是看的题解 首先跑一边kmp 几下ans[p]表示总共匹配到长度p的次数 这些不一定都是恰好到p 所以在处理一下 ans[p]通过处理变成 所有的匹配到长度p的次数 最后答案就 ...
- 【开源java游戏框架libgdx专题】-12-开发工具-图片合成
TexturePackerGui工具: 1.工具使用: 首先看到texturepacker的界面 界面介绍: New pack:创建项目按钮,单击后输入文件名称,创建文件. Input directo ...
- Windows上帝模式
在桌面新建一个文件夹 按F2重命名为 GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} 完成