Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维

#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 & ...
随机推荐
- 机器学习4logistic回归
对于线性回归.logistic回归,在以前准备学习深度学习的时候看过一点,当时的数学基础有点薄弱,虽然现在还是有点差,当时看到神经网络之后就看不下去了. 不过这次是通过python对logistic回 ...
- linux给文件或文件夹加入apache权限
系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,測试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现例如以下php警 ...
- Android图片异步载入框架Android-Universal-Image-Loader
Android-Universal-Image-Loader是一个图片异步载入,缓存和显示的框架.这个框架已经被非常多开发人员所使用,是最经常使用的几个Android开源项目之中的一个,主流的应用,随 ...
- leetcode 二分法 Pow(x, n)
Pow(x, n) Total Accepted: 25273 Total Submissions: 97470My Submissions Implement pow(x, n). 题意:求x的n次 ...
- OpenGL ES2.0 基本编程
1. EGL OpenGL ES命令须要一个rendering context和一个drawing surface. Rendering Context: 保存当前的OpenGL ES状态. Draw ...
- SGU - 403 - Scientific Problem (水)
403. Scientific Problem Time limit per test: 0.25 second(s) Memory limit: 65536 kilobytes input: sta ...
- [洛谷0925]NOIP模拟赛 个人公开赛 OI
P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个 ...
- EMC 存储管理
第一章EMC 产品介绍 1.1. 名词介绍 DAE——磁盘笼.用于装载磁盘的柜子. ◆Disk processor enclosure——含磁盘的控制器单元.存储系统的主要设备,内含存 ...
- mount -o remount,rw /
init=/bin/sh mount -o remount,rw /; sed -i 's/指定字符串/&希望插入的字符串/' 文件 在一文件中指定的字符后插入内容 sed -i 's/指定的 ...
- [Swift]LeetCode1071.字符串的最大公因子 | Greatest Common Divisor of Strings
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...