【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 ...
随机推荐
- <记录> Razor引擎&视图布局
标识符 @ Razor支持HTML和C#代码混编,意味着可以在HTML中随意输出变量 基本使用方法 直接@后面跟变量(当遇到 HTML标签 .空格.换行符等特殊符号时 便认为@之后到特殊符号前为变量名 ...
- 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰
服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...
- 剑指offer例题——用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 首先是概念理解,栈和对列存取的区别 栈(stack)是一种后进先出(last in first out, LI ...
- PHP对接微信支付采坑
第一次做PHP商城项目对接微信支付接口,踩了N次坑,这也不对,那也不对,搞了很久,查了一些资料,终于实现了支付功能,小小总结一下,万一下次遇到就不用到处找资料了. 微信扫码支付 前期准备: 1.微信公 ...
- 23.Hibernate-基础.md
目录 1. ORM和Hibernare 2. 基本开发 2.1 lib 2.2 写对象和引入对象映射 2.2.1 写对象类文件 2.3 配置文件 2.3.1 配置加载映射文件 2.3.2 配置数据库连 ...
- kafka 学习笔记
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- oracle 表空间创建和删除
oracle数据库:数据库对象以及表数据都存储在表空间中,创建用户时可以指定对应的表空间.这样用户可以在各自的表空间中操作数据,互不干扰. 1. 表空间创建 若不清楚表空间对应文件的路径,可以登录系统 ...
- vue 兼容性——ie家族不支持promise
解决方案: 安装: cnpm install es6-promise 在 main.js 引入 : polyfill require("es6-promise").polyfill ...
- [leetcode]150. Evaluate Reverse Polish Notation逆波兰表示法
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- [leetcode]57. Insert Interval插入区间
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...