题目链接: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的更多相关文章

  1. (WAWAWAWAWAWAW) G. Periodic RMQ Problem

    没有联通门 : Codeforces G. Periodic RMQ Problem /* Codeforces G. Periodic RMQ Problem MMP 什么动态开点线段树啊 ... ...

  2. AC日记——Periodic RMQ Problem codeforces 803G

    G - Periodic RMQ Problem 思路: 题目给一段序列,然后序列复制很多次: 维护序列很多次后的性质: 线段树动态开点: 来,上代码: #include <cstdio> ...

  3. codeforces 803G Periodic RMQ Problem

    codeforces 803G Periodic RMQ Problem 题意 长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\). ...

  4. Codeforces 803G Periodic RMQ Problem 线段树

    Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...

  5. Codeforces 803G Periodic RMQ Problem ST表+动态开节点线段树

    思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用  lazy=0 没被覆盖过 els ...

  6. CF803G - Periodic RMQ Problem 动态开点线段树 或 离线

    CF 题意 有一个长度为n × k (<=1E9)的数组,有区间修改和区间查询最小值的操作. 思路 由于数组过大,直接做显然不行. 有两种做法,可以用动态开点版本的线段树,或者离线搞(还没搞)( ...

  7. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MBSubmit: 1594  Solved: 520[Submit] ...

  8. [codeforces 549]G. Happy Line

    [codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...

  9. 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 ...

随机推荐

  1. Response内置对象

    request内置对象:主要用来处理用户的请求 response内置对象:处理对用户的响应(在调用service方法时容器会传递过来) response重要方法: public void addCoo ...

  2. Xamarin.Forms 自定义 TapGestureRecognizer 附加属性

    While creating Xamarin.Forms applications, definitely you are going to need TapGestureRecognizer oft ...

  3. CSS之CSS的三种基本的定位机制(普通流,定位,浮动)

    一.普通流 普通流中元素框的位置由元素在XHTML中的位置决定.块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin计算得到.行内元素在一行中水平布置. 普通流就是html文档中的元素如块 ...

  4. sqlserver 导入excel

    安装完office2013和sqlserver2017时,不知道是盗版问题还是啥 原因, 在sqlserver导入excel时,报错. 在把Excel导入SQL server时出现“未在本地计算机上注 ...

  5. python精进之路1---基础数据类型

    python精进之路1---基本数据类型 python的基本数据类型如上图,重点需要掌握字符串.列表和字典. 一.int.float类型 int主要是用于整数类型计算,float主要用于小数. int ...

  6. cookiejar

    referer:https://www.cnblogs.com/why957/p/9297779.html文章介绍了四种模拟登陆方法 yield Request()可以将一个新的请求返回给爬虫执行 在 ...

  7. laravel 核心类Kernel

    vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php.是laravel处理网络请求的最核心类,在app容器准备好了之后, ...

  8. 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...

  9. 遗传算法(Genetic Algorithm, GA)及MATLAB实现

    遗传算法概述: • 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择.适者生存”的演化法则,它最初由美国Michigan大学的J. Hollan ...

  10. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...