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 & ...
随机推荐
- Linq查询datatable的记录集合
通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量,比方深度 string strDepth=查询深度的值: var dataRows = from datarow ...
- zippo打火机的特点:
1. 耐寒.零下30多度环境下仍然能打火 2.抗压.被1.5吨的汽车压过之后仍然能打火 3.抗风,在7级下面的风速中火焰都不会熄灭 4.防水,放入水中.取出来之后任然能打火
- CentOS下安装使用phpMyAdmin. Set up phpMyAdmin on CentOS
须要组件: Apache PHP Mysql phpMyAdmin Apache 0. yum install httpd 1. 确认版本号 $ httpd -v 2. 启动apache $ sudo ...
- 基于Windows Azure 安装 SharePoint 2010简体中文语言包
在Windows Azure上安装的Windows Server默认是英文版本的,当时安装的SharePoint也是英文版的,为方便使用,决定安装中文的语言包,具体过程如下: 1. 安装 Window ...
- luogu1197 [JSOI2008]星球大战
题目大意 有一个无向图,每次删除一个节点,求删除后图中连通块的个数.(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中) 题解 连通块?用并查集可以找到一个连通块,但是 ...
- C# Interactive Walkthrough
C# Interactive Walkthrough
- 时序数据库深入浅出之存储篇——本质LSMtree,同时 metric(比如温度)+tags 分片
什么是时序数据库 先来介绍什么是时序数据.时序数据是基于时间的一系列的数据.在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性.规律性.异常性:往未来看可以做大数据分析,机器 ...
- mount -o remount,rw /
init=/bin/sh mount -o remount,rw /; sed -i 's/指定字符串/&希望插入的字符串/' 文件 在一文件中指定的字符后插入内容 sed -i 's/指定的 ...
- C# List常识之经常被忽略的常识
最近在接收前辈的代码,越来越会发现有很多.net已经封装好的方法可以使用,我们却不知道,然后自己去For/Foreach循环解决自己的需求问题 总的来说:当下很忧伤啊.总结了几个经常需要用却不知道的方 ...
- Area(pick定理)
http://poj.org/problem?id=1265 题意:起始为(0,0),给出每个点的偏移量,求依次连接这些点形成的多边形边界上格点的个数. 思路:先将各个点的坐标求出存入,由pick定理 ...