【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】火车管理(主席树)的更多相关文章

  1. UOJ#218. 【UNR #1】火车管理 线段树 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...

  2. UNR #1 火车管理

    很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...

  3. 【UNR #1】火车管理

    题目描述 uoj 旗下有一个火车站,用来管理属于 uoj 的小火车. 火车站一共有 nn 条编号为 1,…,n1,…,n 的,只有一端的用来存放小火车的铁路,由于小火车特殊的构造,每条铁路可以停放无数 ...

  4. UOJ #218. 【UNR #1】火车管理

    Description Solution 实际上添加问题就是一个线段树区间覆盖问题,打标记就好 对于弹栈操作比较难搞,实际上也就是一个历史查询,我们不需要保存栈中的每一个元素,我们通过查找历史状态就可 ...

  5. [bzoj3932][CQOI2015][任务查询系统] (主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

  6. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  7. bzoj 3932 [CQOI2015]任务查询系统(主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

  8. UOJ 218 火车管理

    http://uoj.ac/problem/218 思路:建立一个可持久化线段树,代表这个位置的火车是哪辆,然后再弄一个线段树维护答案. 如果询问,直接询问线段树. 如果区间压入,直接在主席树上面压入 ...

  9. 【BZOJ3932】任务查询系统(主席树)

    [BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...

随机推荐

  1. leetcode416

    class Solution { public boolean canPartition(int[] nums) { int sum=0; for (int num:nums) sum+= num; ...

  2. CSS: Grid homework redact.

    The web homework: Finished design: (I use six block with different color to show this homework and I ...

  3. 转:解决AndroidStudio连不上Android设备真机的问题

    Android手机开发Android应用的时候,需要连接真机,进行应用软件的真机调试,但是由于诸多原因,可能导致无法与实现连接: 在我们连接了Android设备出现上面这种情况的时候,可以打开设备管理 ...

  4. 25.Hibernate-配置文件.md

    目录 1.主配置文件 1.1定义 1.1.1分类 1.1.2分类 1.1.3不使用配置文件生成表 1.2教程 2. 映射配置文件 1.主配置文件 1.1定义 1.1.1分类 在hibernate的配置 ...

  5. 面向对象的css less 和sass

    Css 初始化   reset.css      或者  normalise .   Near.css兼容IE6以及现代浏览器. Oocss  也就是面向对象的css         面向对象是将cs ...

  6. JS获取URL中文参数乱码的解决方法

    浏览器URL参数值中带有汉字字符,在接收时直接获取会出现乱码,下面是解决方法(传递前不需要encodeURI): function getUrlVars() { var vars = [], hash ...

  7. pytorch入门之安装和配置

    pytorch是一种python接口的深度学习框架,其他的框架还有caffe,tensorflow等等. 1,pytorch目前支持linux和OSX两种系统.支持的Python版本有2.7,3.5, ...

  8. Curator的cluster,实现多节点数据共享

    模拟两个客户端,实现多节点数据共享 package bjsxt.curator.cluster; import org.apache.curator.RetryPolicy; import org.a ...

  9. 100-days: fifteen

    Title: Disney(迪士尼) moves from behemoth to colossus with closing(使…结束,使停止) of Fox(福克斯) deal(商业上的交易/协议 ...

  10. iOS高德地图SDK定位和搜索附近信息的具体使用

    1.显示地图.定位.显示当前位置. 导入你需要的功能的头文件,申明全局变量,代理方法等等.   初始化地图,在控制器即将显示额时候打开定位和跟踪用户,这里对参数不懂的话康忙进去都有注释.   对了.i ...