Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维
![](https://img2018.cnblogs.com/blog/1519179/201907/1519179-20190701171651197-1759867108.png)
#include<bits/stdc++.h>
#define maxn 500005
using namespace std;
int n,Q,ty,lastans=0;
int rt[maxn], tim[maxn], lp[maxn], tp[maxn];
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
}
namespace tree1
{
#define lson ( x<<1)
#define rson ( (x<<1)|1)
int sumv[500005<<2],lazy[500005<<2];
void mark(int l,int r,int x,int k)
{
sumv[x]=(r-l+1)*k;
lazy[x]=k;
}
void pushup(int x)
{
sumv[x]=sumv[lson]+sumv[rson];
}
void pushdown(int l,int r,int x)
{
if(!lazy[x]) return;
int mid=(l+r)>>1;
if(mid >= l) mark(l, mid, lson, lazy[x]);
if(r > mid) mark(mid + 1, r, rson, lazy[x]);
lazy[x]=0;
}
void update(int l,int r,int x,int L,int R,int k)
{
if(l>=L&&r<=R)
{
mark(l,r,x,k);
return;
}
pushdown(l,r,x);
int mid=(l+r)>>1;
if(L<=mid) update(l,mid,lson,L,R,k);
if(R>mid) update(mid+1,r,rson,L,R,k);
pushup(x);
}
int query(int l,int r,int x,int L,int R)
{
if(l>=L&&r<=R) return sumv[x];
pushdown(l, r, x);
int mid=(l+r)>>1, tmp=0;
if(L<=mid) tmp+=query(l,mid,lson,L,R);
if(R>mid) tmp+=query(mid+1,r,rson,L,R);
return tmp;
}
#undef lson
#undef rson
}; namespace tree2
{
int tot=0;
int tag[maxn*75],value[maxn*75];
int lson[maxn*75],rson[maxn*75];
void mark(int x,int delta)
{
value[x]=tag[x]=delta;
return;
}
void pushdown(int l,int r,int x)
{
if(!tag[x]) return;
int mid=(l+r)>>1;
if(mid>=l && !lson[x]) lson[x]=++tot;
if(r > mid && !rson[x]) rson[x]=++tot;
if(lson[x]) mark(lson[x], tag[x]);
if(rson[x]) mark(rson[x], tag[x]);
tag[x]=0;
}
void add(int &k,int kk,int l,int r,int L,int R,int delta)
{
tag[k=++tot]=0;
if(l>=L&&r<=R)
{
mark(k, delta);
return;
}
int mid=(l+r)>>1;
pushdown(l,r,kk);
lson[k]=lson[kk], rson[k]=rson[kk];
if(L <= mid) add(lson[k], lson[kk], l, mid, L, R, delta);
if(R > mid) add(rson[k], rson[kk], mid + 1, r, L, R, delta);
}
int query(int l,int r,int k,int pos)
{
if(!k || l == r) return value[k];
pushdown(l,r,k);
int mid=(l+r)>>1;
if(pos<=mid)
return query(l,mid,lson[k], pos);
else
return query(mid+1,r,rson[k],pos);
}
};
int main()
{
// setIO("input");
scanf("%d%d%d",&n,&Q,&ty);
int opt,l,r,dd;
for(int i=1;i<=Q;++i)
{
scanf("%d",&opt);
switch(opt)
{
case 1 :
{
scanf("%d%d",&l,&r);
l=(l+lastans*ty)%n+1;
r=(r+lastans*ty)%n+1;
if(l>r) swap(l,r);
lastans=tree1::query(1,n,1,l,r);
printf("%d\n",lastans);
rt[i]=rt[i-1];
break;
}
case 2 :
{
scanf("%d",&l);
l=(l+lastans*ty)%n+1;
int o = tree2::query(1, n, rt[i-1],l); //查询修改的 l 的修改操作.
if(!o) rt[i]=rt[i-1];
else
{
int oo = tree2::query(1,n,rt[o-1],l); // 上一次操作
tree1::update(1,n,1,l,l,tp[oo]); //
tree2::add(rt[i], rt[i-1], 1, n, l,l,oo);
}
break;
}
case 3 :
{
scanf("%d%d%d",&l,&r,&dd);
l=(l+lastans*ty)%n+1;
r=(r+lastans*ty)%n+1;
if(l>r) swap(l,r);
tp[i]=dd;
tree1::update(1,n,1,l,r,dd);
tree2::add(rt[i],rt[i-1],1,n,l,r,i);
break;
}
}
}
return 0;
}
Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维的更多相关文章
- 【UOJ UNR #1】火车管理 可持久化线段树
用可持久化线段树维护每个站的第一辆车和每个站的前一次更新的位置即可. #include<iostream> #include<cstring> #include<cstd ...
- UNR #1 火车管理
很简单 用一个线段树维护 1.答案 2.当前栈顶是什么时候push进来的 然后用一棵以时间为版本的可持久化线段树维护每个操作之后第一个覆盖到他的操作是哪个 就可以了 询问直接在线段树上询问,修改在两棵 ...
- UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- 【NOIP2017】列队【可持久化线段树】
题目链接 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×mn×m名学生,方阵的行数为 n ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- 【BZOJ-2653】middle 可持久化线段树 + 二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1298 Solved: 734[Submit][Status][Discu ...
- HDU 4866 Shooting(持久化线段树)
view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include & ...
随机推荐
- 洛谷 P1481 魔族密码
P1481 魔族密码 题目描述 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之子:我呕……(杀死人的眼神)快说题目!否则……-_-### 花 ...
- java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,
java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...
- 关于压缩软件gzip和xz的简单对照
晚上因为处理磁盘报警的须要.进行了日志压缩,在此次压缩中分别使用了gzip和xz软件对文本进行了压缩.压缩的结果很令人诧异. 出于对xz好奇的原因是因为在下载内核源码时常常能够看到.xz格式的文件包. ...
- cppunit 的使用
原文: http://blog.csdn.net/abcdef0966/article/details/5699248
- C语言里全局变量管理
C语言里信息封装比較弱,仅仅有静态变量的文件作用域. 假设不加约束.非常easy造成全局变量满天飞. 假设定义一个全局结构体.把全局变量都放到这个GlobleVariate里,应该好管一些,至少比裸奔 ...
- Html5笔记 表格 布局
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- acdream 1414 Geometry Problem
Geometry Problem Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- user和userdebug区别
user:不可以root userdebug:可以root
- android recovery 系统代码分析 -- 选择进入【转】
本文转载自:http://blog.csdn.net/andyhuabing/article/details/9226569 最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清. An ...
- 【POJ 1456】 Supermarket
[题目链接] http://poj.org/problem?id=1456 [算法] 贪心 + 堆 [代码] #include <algorithm> #include <bitse ...