Codeforces 803 G. Periodic RMQ Problem
题目链接:http://codeforces.com/problemset/problem/803/G
大致就是线段树动态开节点。
然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点所代表的区间定位到原序列中,利用ST表查一下区间最小值就可以了。
定位:
llg minn(llg l,llg r)
{
if(r-l+>=n) return mt;
l%=n;if(!l) l=n;
r%=n;if(!r) r=n;
if(l>r) return min(gw(l,n),gw(,r));
else return gw(l,r);
}
其中${gw(l,r)}$表示原序列${[l,r]}$中元素的最小值。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define llg int
#define inf 0x7fffffff
#define maxn 500010
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg ST[maxn][],mt=inf,n,k,Q,pre[maxn],cnt; struct point
{
llg lc,rc,l,r,set,val;
}po[maxn*]; inline llg getint()
{
llg w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar(); while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} llg gw(llg l,llg r)
{
int k=pre[r-l+];
return min(ST[l][k],ST[r-(<<k)+][k]);
} llg minn(llg l,llg r)
{
if(r-l+>=n) return mt;
l%=n;if(!l) l=n;
r%=n;if(!r) r=n;
if(l>r) return min(gw(l,n),gw(,r));
else return gw(l,r);
} void make_st()
{
for(llg i=;i<=n;i++) pre[i]=pre[i>>]+;
for(llg i=;i<=n;i++) ST[i][]=getint();
for(llg i=;i<=n;i++) mt=min(mt,ST[i][]);
for(llg i=;i<=n;i++) pre[i]=pre[i>>]+;
for(llg j=;j<=;j++)
for(llg i=,u=(<<j),p=(u>>);i+u-<=n;i++)
ST[i][j]=min(ST[i][j-],ST[i+p][j-]);
cnt=,po[].l=,po[].r=n*k,po[].val=mt;
} llg new_po(llg l,llg r)
{
llg o=++cnt;
po[o].val=minn(l,r);
po[o].l=l,po[o].r=r;
return o;
} void update(llg o)
{
if (po[o].l==po[o].r) return ;
po[o].val=inf;
if (po[o].lc) po[o].val=min(po[o].val,po[po[o].lc].val);
else
{
po[o].lc=cnt+;
new_po(po[o].l,(po[o].l+po[o].r)/);
po[o].val=min(po[o].val,po[po[o].lc].val);
}
if (po[o].rc) po[o].val=min(po[o].val,po[po[o].rc].val);
else
{
po[o].rc=cnt+;
new_po((po[o].l+po[o].r)/+,po[o].r);
po[o].val=min(po[o].val,po[po[o].rc].val);
}
} void pushdown(llg o)
{
llg l=po[o].l,r=po[o].r,lc=po[o].lc,rc=po[o].rc,mid=(l+r)>>;
if (!po[o].set || l==r) return ;
if (!lc)
{
lc=cnt+;
new_po(l,mid);
}
if (!rc)
{
rc=cnt+;
new_po(mid+,r);
}
po[lc].set=po[rc].set=po[lc].val=po[rc].val=po[o].set;
po[o].set=;
po[o].lc=lc;
po[o].rc=rc;
return ;
} void modify(llg o,llg l,llg r,llg L,llg R,llg v)
{
pushdown(o);
if (o==) o=new_po(l,r);
llg mid=(l+r)>>;
if (l>=L && r<=R)
{
po[o].val=v;
po[o].set=v;
return ;
}
if (mid>=L)
{
llg son=po[o].lc;
if (po[o].lc==) po[o].lc=cnt+;
modify(son,l,mid,L,R,v);
}
if (mid<R)
{
llg son=po[o].rc;
if (po[o].rc==) po[o].rc=cnt+;
modify(son,mid+,r,L,R,v);
}
update(o);
} llg query(llg o,llg l,llg r,llg L,llg R)
{
pushdown(o);
if (o==) o=new_po(l,r);
if (l>=L && r<=R) return po[o].val;
llg mid=(l+r)>>,ans=inf;
if (mid>=L)
{
llg son=po[o].lc;
if (po[o].lc==) po[o].lc=cnt+;
ans=min(ans,query(son,l,mid,L,R));
}
if (mid<R)
{
llg son=po[o].rc;
if (po[o].rc==) po[o].rc=cnt+;
ans=min(ans,query(son,mid+,r,L,R));
}
return ans;
} int main()
{
yyj("seg");
cin>>n>>k;
make_st();
llg T=n*k;
cin>>Q;
while (Q--)
{
llg ty=getint(),l=getint(),r=getint();
if (ty==)
modify(,,T,l,r,getint());
else
printf("%d\n",query(,,T,l,r));
}
return ;
}
Codeforces 803 G. Periodic RMQ Problem的更多相关文章
- (WAWAWAWAWAWAW) G. Periodic RMQ Problem
没有联通门 : Codeforces G. Periodic RMQ Problem /* Codeforces G. Periodic RMQ Problem MMP 什么动态开点线段树啊 ... ...
- AC日记——Periodic RMQ Problem codeforces 803G
G - Periodic RMQ Problem 思路: 题目给一段序列,然后序列复制很多次: 维护序列很多次后的性质: 线段树动态开点: 来,上代码: #include <cstdio> ...
- codeforces 803G Periodic RMQ Problem
codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...
- Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用 lazy=0 没被覆盖过 els ...
- CF803G - Periodic RMQ Problem 动态开点线段树 或 离线
CF 题意 有一个长度为n × k (<=1E9)的数组,有区间修改和区间查询最小值的操作. 思路 由于数组过大,直接做显然不行. 有两种做法,可以用动态开点版本的线段树,或者离线搞(还没搞)( ...
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- [codeforces 549]G. Happy Line
[codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...
- BZOJ3339 Rmq Problem
[bzoj3339]Rmq Problem Description Input Output Sample Input 7 5 0 2 1 0 1 3 2 1 3 2 3 1 4 3 6 2 7 Sa ...
随机推荐
- 【记录tomcat报错解决办法】tomcat请求组件没有找到的问题
报错原因: An incompatible version 1.1.14 of APR based Apache Tomcat Native library is installed, while T ...
- 移动iptv安装三方软件
1.思路: 分为硬件和软件. a.硬件是ttl直接上串口,弄得比较复杂,且容易损坏盒子,先不考虑 b.软件:抓包获取iptv的请求数据,将移动光猫的iptv出口接到交换机上,电脑和盒子接入到同一个交 ...
- js中创建命名空间的几种写法
在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...
- fastJson解析报错:com.alibaba.fastjson.JSONException: can't create non-static inner class instance.
原因: 如果出现类嵌套类的情况,需要将被嵌套的那个类设置为static. 比如: public class AA { // 相关属性 public class BB {//会报错 // 相关属性 } ...
- Opencv-Python No module named 'cv2.cv2'
关于 No module named 'cv2.cv2'等其他一些问题,一般都是版本不兼容的问题,重装即可. pip uninstall opencv-python 然后 pip install op ...
- Xgboost总结
从决策树.随机森林.GBDT最终到XGBoost,每个热门算法都不是孤立存在的,而是基于一系列算法的改进与优化.决策树算法简单易懂可解释性强,但是过拟合风险很大,应用场景有限:随机森林采用Baggin ...
- windows 下面安装make
1.前面文章中已经提到了wingw32的安装,安装好之后设置相应环境变量.2.打开cmd,输入 mingw-get install mingw32-make,会进行安装.3.输入 mingw32-ma ...
- C++——简单数据类型及布尔类型
一. 简单数据类型 数据类型描述了对象在内存存储区中占据的空间大小,描述了对象能够表示的数据范围 和类型.C++语言中常用的数据类型有整型.实型.字符型(这3种类型也被称之为简单数 据类型).数组类型 ...
- CentOS 7 Gitlab+Jenkins持续集成+自动化部署
基于上次的环境<部署Gitlab+Jenkins持续集成环境> 来实现自动化部署 系统管理–>插件管理–>安装以下插件: Credentials Plugin(默认已经安装) ...
- [经验共享] MapGIS实用小功能图解——由excel文件导成MapGIS点文件
项目小组的几个成员都是学地下水和环境的,对于GIS懂得不是很多,于是把一些我们经常用到的mapgis实用小功能做成帮助文档,方便大家使用,发布共享! 1.整理好EXCEL文件(注意X,Y坐标的正确性( ...