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 & ...
随机推荐
- TSP服务商
1.何为TSP? TSP([1] Service Provider),在Telematics产业链居于核心地位,上接汽车.车载设备制造商.网络运营商,下接内容提供商.谁掌控了TSP,谁就能掌握Tele ...
- [bzoj2850]巧克力王国_KD-Tree
巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...
- mongodb之监控
监控方式 命令行工具 mongostat命令 用途 用于mongod或者mongos操作类型统计,网络流量统计,当前并发数等统计 用法 mongostat options <sleeptime& ...
- ArcGIS Engine 创建索引(属性索引)——提高查询效率
转自原文 ArcGIS Engine 创建索引(属性索引)——提高查询效率 众所周知,建立索引可以提高查询的效率,当对FeatureClass中的某一列频繁的查找,且数据量比较大时,建立索引是非常有必 ...
- v$open_cursor中的相同record
之前在查看v$open_cursor的时候,发现很多相同的record. 让我很疑惑, sid saddr sql_id 都相同,我就想 这不是一个cursor吗? 那为什么在open_cursor中 ...
- 关于压缩软件gzip和xz的简单对照
晚上因为处理磁盘报警的须要.进行了日志压缩,在此次压缩中分别使用了gzip和xz软件对文本进行了压缩.压缩的结果很令人诧异. 出于对xz好奇的原因是因为在下载内核源码时常常能够看到.xz格式的文件包. ...
- 3.0 - remote access 基础知识
RA概述: remote access: 广域网的远程连接,按L1分类: 1:通过电路交换网络实现的专线:(circuit switching) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- js 推断字符串是否包括某字符串
var Cts = "bblText"; if(Cts.indexOf("Text") > 0 ) { alert('Cts中包括Text字符串'); } ...
- /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err
/usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err ...
- TTS-零基础入门之停止列表中单条语音播报
做了一个语音 循环播报列表信息.当我新删除了一天列表之后,发现它仅仅有在下一轮播报中才会取消.这明显是不合理的. 一開始的代码是这样写的. <span style="font-fami ...