题目链接: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. 关于eclipse常用的一些快捷键

    Ctrl+Alt+H :查看方法被哪些代码调用了 Ctrl + Shif +O :自动引导类包 Ctrl+Shift+/     : 加上段注释 Ctrl+Shift+\  : 取消段注释 ALT+/ ...

  2. 67.web--手机端兼容性问题

    H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-width,initia ...

  3. windows----------火狐浏览器访问所有https网站都显示链接不安全解决办法

    1.如有以下情况,点右边的“高级”,看看自己的错误码是否为SEC_ERROR_UNKNOWN_ISSUER 2.在地址栏键入"about:config" 点击“我了解此风险” 3. ...

  4. object tracking 词汇积累

    1. off-the-shelf adj. 现成的:常备的:成品的 adv. 现成地:无需作重大修改地 commercial off-the-shelf商用现货商规成品商业货架产品供应 off-the ...

  5. html5 css折叠导航栏

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. 20175208《Java程序设计》第五周学习总结

    教材学习内容总结 1.接口:1)接口声明: interface //接口的名字 2)接口体2.实现接口:类实现接口:一个类需要在类声明中使用关键字implements声明该类实现一个或多个接口.如果实 ...

  7. redis 在 php 中的应用(Hash篇)

    本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) Redis hash 是一个string类型的f ...

  8. ABP入门系列之3——创建实体/Code First创建数据表

    一.首先来看看ABP体系结构 领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现.实体(Entity): 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表.仓储(Repo ...

  9. 对比剖析Swarm Kubernetes Marathon编排引擎

    Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目.Docker原生集群(S ...

  10. 编译原理---antlr实践+编译过程理解+课程理解知识点

    0.其他说明 0.0编译器分为前.中.后端,课上主要学的是前端.前端又分为词法分析(lexical analysis).语法分析(syntax analysis).语义分析(semantic anal ...