【UNR #1】火车管理(主席树)
【UNR #1】火车管理(主席树)
好好的代码被 \(extra\ test\) 卡常了。。。我就放一个目前最快的版本吧。。。
题意简化:
有 \(n\) 个栈,\(m\) 次操作。
将 \(x\) 压入 \([l,r]\) 的栈中
将 \(l\) 的栈顶弹出
询问 \([l,r]\) 栈顶的和
\(n,m\leq 5\times 10^5\)
虽然最优解是神仙二叉树,我只会主席树的解法。。。
显然 \(1,3\) 操作用一棵线段树就够了,\(2\) 操作需要另外一棵主席树,并且在历史版本上修改。
\(Code\ Below:\)
#include <bits/stdc++.h>
using namespace std;
const int maxn=500000+10;
int n,m,k,a[maxn];
namespace IO{
#define gc() (iS==iT?(iT=(iS=ibuff)+fread(ibuff,1,SIZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
const int SIZ=1<<21|1;
char *iS,*iT,ibuff[SIZ],obuff[SIZ],*oS=obuff,*oT=oS+SIZ-1,fu[110],c;int fr;
inline void out(){
fwrite(obuff,1,oS-obuff,stdout);
oS=obuff;
}
template <class T>
inline void read(T &x){
x=0;T y=1;
for(c=gc();(c>'9'||c<'0')&&c!='-';c=gc());
c=='-'?y=-1:x=(c&15);
for(c=gc();c>='0'&&c<='9';c=gc()) x=x*10+(c&15);
x*=y;
}
template <class T>
inline void print(T x,char text='\n'){
if(x<0) *oS++='-',x*=-1;
if(x==0) *oS++='0';
while(x) fu[++fr]=x%10+'0',x/=10;
while(fr) *oS++=fu[fr--];
*oS++=text;out();
}
}
struct President_Tree{
#define rt(x) PT.rt[x]
struct node{
int sum,lazy,ls,rs;
}t[maxn*80];
int rt[maxn],cnt;
inline void pushdown(int x){
if(t[x].lazy){
if(!t[x].ls) t[x].ls=++cnt;
if(!t[x].rs) t[x].rs=++cnt;
t[t[x].ls].sum=t[t[x].rs].sum=t[t[x].ls].lazy=t[t[x].rs].lazy=t[x].lazy;
t[x].lazy=0;
}
}
inline void update(int &x,int y,int L,int R,int C,int l,int r){
x=++cnt;
if(L <= l && r <= R){t[x].sum=t[x].lazy=C;return;}
pushdown(y);t[x].ls=t[y].ls;t[x].rs=t[y].rs;
int mid=(l+r)>>1;
if(L <= mid) update(t[x].ls,t[y].ls,L,R,C,l,mid);
if(R > mid) update(t[x].rs,t[y].rs,L,R,C,mid+1,r);
}
inline int query(int x,int l,int r,int k){
if(l == r) return t[x].sum;
pushdown(x);
int mid=(l+r)>>1;
if(k <= mid) return query(t[x].ls,l,mid,k);
else return query(t[x].rs,mid+1,r,k);
}
}PT;
struct Segment_Tree{
#define lson (rt<<1)
#define rson (rt<<1|1)
int sum[maxn<<2],lazy[maxn<<2];
inline void pushup(int rt){sum[rt]=sum[lson]+sum[rson];}
inline void pushdown(int rt,int len){
if(lazy[rt]){
sum[lson]=(len-(len>>1))*lazy[rt];
sum[rson]=(len>>1)*lazy[rt];
lazy[lson]=lazy[rson]=lazy[rt];
lazy[rt]=0;
}
}
inline void update(int L,int R,int C,int l,int r,int rt){
if(L <= l && r <= R){
sum[rt]=(r-l+1)*C;lazy[rt]=C;
return ;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
if(L <= mid) update(L,R,C,l,mid,lson);
if(R > mid) update(L,R,C,mid+1,r,rson);
pushup(rt);
}
inline int query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R) return sum[rt];
pushdown(rt,r-l+1);
int mid=(l+r)>>1,ans=0;
if(L <= mid) ans+=query(L,R,l,mid,lson);
if(R > mid) ans+=query(L,R,mid+1,r,rson);
return ans;
}
}ST;
int main()
{
IO::read(n),IO::read(m),IO::read(k);
int op,l,r,x,y,lastans=0;
for(int i=1;i<=n;i++){
rt(i)=rt(i-1);
IO::read(op);
if(op==1){
IO::read(l),IO::read(r);
l=(l+k*lastans)%n+1;
r=(r+k*lastans)%n+1;
if(l>r) swap(l,r);
IO::print(lastans=ST.query(l,r,1,n,1));
}
if(op==2){
IO::read(l);
l=(l+k*lastans)%n+1;
x=PT.query(rt(i),1,n,l);
if(x){
y=PT.query(rt(x-1),1,n,l);
PT.update(rt(i),rt(i),l,l,y,1,n);
ST.update(l,l,a[y],1,n,1);
}
}
if(op==3){
IO::read(l),IO::read(r);
l=(l+k*lastans)%n+1;
r=(r+k*lastans)%n+1;
if(l>r) swap(l,r);
IO::read(x);a[i]=x;
PT.update(rt(i),rt(i),l,r,i,1,n);
ST.update(l,r,x,1,n,1);
}
}
return 0;
}
【UNR #1】火车管理(主席树)的更多相关文章
- UOJ#218. 【UNR #1】火车管理 线段树 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...
- UNR #1 火车管理
很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...
- 【UNR #1】火车管理
题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...
- UOJ #218. 【UNR #1】火车管理
Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- POJ 2104&HDU 2665 Kth number(主席树入门+离散化)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 50247 Accepted: 17101 Ca ...
- bzoj 3932 [CQOI2015]任务查询系统(主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- UOJ 218 火车管理
http://uoj.ac/problem/218 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...
- 【BZOJ3932】任务查询系统(主席树)
[BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...
随机推荐
- [原]vue中各模块的实际引用
检查发现: 1.vue实际引用文件配置位置 alias: { 'vue$': 'vue/dist/vue.esm.js', 此位置替换了vue包内的package.json中定义的位置 } 2.vue ...
- 【391】栈与队列,Python实现
参考:python实现stack(栈)和队列(queue) - hjhmpl123的博客 - CSDN博客 参考:Python3 数据结构 | 菜鸟教程 栈和队列是两种基本的数据结构,同为容器类型.两 ...
- cdn节点自定义防CC代码在哪里抄
1. 登陆节点的3311后台 1. http redirect(普通) HTTP/1.1 302 FOUNDConnection: keep-aliveLocation: {{url}} <ht ...
- datatables插件提示Cannot reinitialise DataTable的解决办法
这个错误是由于重新设置数据源,又没有将原来的数据清空导致的. 网上有很多解决方案,试了都不管用. 最后找到一种方法,将原来的table销毁,再初始化. 方法是在datatable初始化的时候加入属性 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第三篇 Flask 中的 request 之 先知道有这么个东西
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...
- linux操作命令,批量注释#方法
用户,密码 1.修改密码:passwd 2.切换用户: su root 3.增加用户:adduesr+用户 4.root更改目录的权限:chown leopard:leopard data/ -R ...
- 利用Sharding-Jdbc实现分表[z]
[z]https://www.cnblogs.com/codestory/p/5591651.html 你们团队使用SpringMVC+Spring+JPA框架,快速开发了一个NB的系统,上线后客户订 ...
- 关于前端设置cookie
cookie既可以后端设置也可以在前端设置,例如登陆/注册功能,每次都要向服务器请求用户数据,这种就可以把cookie放到前端储存起来. 当网页要发http请求时,浏览器会先检查是否有相应的cooki ...
- c#Dapper 批量插入Mysql
<connectionStrings> <add name="sqlconnectionString" connectionString="server ...
- 201621123002《JAVA程序设计》第五周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 interface关键字 implements关键字 Comparable abstract Comparator 1.2 ...