codeforces 803G Periodic RMQ Problem
codeforces 803G Periodic RMQ Problem
题意
长度为\(1e5\)的数组复制\(1e4\)次,对新的数组进行区间覆盖和区间最小值查询两种操作,操作次数\(1e5\)。
参考博客
http://kugwzk.info/index.php/archives/2404
题解一
小数组复用多次变成大数组,那么可以用ST表维护小数组的区间最小值,大数组还是用线段树维护\(Min[]\)和\(lazy[]\),但是不用进行build操作,所以upd和qry操作中标记下传的时候儿子节点可能会不存在,需要动态开点。
题解二
离线做法。离散化之后用普通线段树就能搞定。
总结
写线段树的题目最重要的是,要知道自己在维护什么东西,每个结点上值的意义都要很清楚。
代码一
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//------
const int N=101010;
int n,k;
int b[N];
int st[N][22];
int stmin(int l,int r) {
int _=log2(r-l+1);
return min(st[l][_], st[r-(1<<_)+1][_]);
}
int stMin(int l,int r) {
int L=l/n, R=r/n;
if(L==R) {
return stmin(l%n, r%n);
} else if(L+1==R) {
return min(stmin(l%n, n-1), stmin(0, r%n));
} else {
return stmin(0, n-1);
}
}
int cntn;
int ls[N*244], rs[N*244], mi[N*244], la[N*244];
void down(int rt, int l, int r, int mid) {
bool fl=0, fr=0;
if(ls[rt]==-1) ls[rt]=++cntn, fl=1;
if(rs[rt]==-1) rs[rt]=++cntn, fr=1;
int L=ls[rt], R=rs[rt];
if(la[rt]) {
la[L]=mi[L]=la[rt];
la[R]=mi[R]=la[rt];
la[rt]=0;
} else {
if(fl) mi[L]=stMin(l, mid);
if(fr) mi[R]=stMin(mid+1, r);
}
}
void upd(int L,int R,int c,int l,int r,int rt) {
if(L<=l&&r<=R) {
mi[rt]=la[rt]=c;
return ;
}
int mid=l+r>>1;
down(rt, l, r, mid);
if(L<=mid) upd(L,R,c,l,mid,ls[rt]);
if(R>=mid+1) upd(L,R,c,mid+1,r,rs[rt]);
mi[rt]=min(mi[ls[rt]], mi[rs[rt]]);
}
int qry(int L,int R,int l,int r,int rt) {
if(L<=l&&r<=R) return mi[rt];
int mid=l+r>>1;
down(rt, l, r, mid);
int ans=1e9+7;
if(L<=mid) ans=min(ans, qry(L, R, l, mid, ls[rt]));
if(R>=mid+1) ans=min(ans, qry(L, R, mid+1, r, rs[rt]));
return ans;
}
int main() {
while(~scanf("%d%d",&n,&k)) {
///init
cntn=0;
memset(la,0,sizeof(la));
memset(ls,-1,sizeof(ls));
memset(rs,-1,sizeof(rs));
///read
rep(i,0,n) scanf("%d",b+i);
///st_ini
rep(i,0,n) st[i][0]=b[i];
for(int i=1;(1<<i)<=n;++i) {
for(int j=0;j+(1<<i)-1<n;++j) {
st[j][i]=min(st[j][i-1], st[j+(1<<(i-1))][i-1]);
}
}
///solve
mi[0]=stmin(0, n-1);
int q;scanf("%d",&q);
while(q--) {
int t,l,r;scanf("%d%d%d",&t,&l,&r);
--l;--r;
if(t==1) {
int x;scanf("%d",&x);
upd(l, r, x, 0, n*k-1, 0);
} else {
printf("%d\n",qry(l, r, 0, n*k-1, 0));
}
}
}
return 0;
}
代码二
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//------
const int N=101010;
int n,k,q;
int st[N][22];
int stmin(int l,int r) {
int _=log2(r-l+1);
return min(st[l][_], st[r-(1<<_)+1][_]);
}
int stMin(int l,int r) {
if(l>r) return 1e9+7;
int L=l/n, R=r/n;
if(L==R) return stmin(l%n, r%n);
else if(L+1==R) return min(stmin(l%n, n-1), stmin(0, r%n));
else return stmin(0, n-1);
}
int cntx;
int x[N<<1], val[N<<2];
struct Q {
int t,l,r,x;
Q() {}
Q(int a,int b,int c,int d) {
t=a;l=b;r=c;x=d;
}
}qq[N];
int mi[N<<4], la[N<<4];
void build(int l, int r, int rt) {
la[rt]=0;
if(l==r) {
mi[rt]=val[l];
return ;
}
int mid=l+r>>1;
build(l, mid, rt<<1);
build(mid+1, r, rt<<1|1);
mi[rt]=min(mi[rt<<1], mi[rt<<1|1]);
}
void down(int rt) {
if(la[rt]==0) return ;
int L=(rt<<1), R=(L|1);
la[L]=mi[L]=la[R]=mi[R]=la[rt];
la[rt]=0;
}
void upd(int L,int R,int c,int l,int r,int rt) {
if(L<=l&&r<=R) {
mi[rt]=la[rt]=c;
return ;
}
int mid=l+r>>1;
down(rt);
if(L<=mid) upd(L,R,c,l,mid,rt<<1);
if(R>=mid+1) upd(L,R,c,mid+1,r,rt<<1|1);
mi[rt]=min(mi[rt<<1], mi[rt<<1|1]);
}
int qry(int L,int R,int l,int r,int rt) {
if(L<=l&&r<=R) return mi[rt];
down(rt);
int mid=l+r>>1;
int ans=1e9+7;
if(L<=mid) ans=min(ans,qry(L,R,l,mid,rt<<1));
if(R>=mid+1) ans=min(ans,qry(L,R,mid+1,r,rt<<1|1));
return ans;
}
int main() {
while(~scanf("%d%d",&n,&k)) {
///init
cntx=0;
///read
rep(i,0,n) scanf("%d",&st[i][0]);
scanf("%d",&q);
rep(i,0,q) {
int t,l,r,xx=0;scanf("%d%d%d",&t,&l,&r);
--l;--r;
if(t==1) scanf("%d",&xx);
qq[i]=Q(t,l,r,xx);
x[++cntx]=l;
x[++cntx]=r;
}
///st
for(int i=1;(1<<i)<=n;++i) {
for(int j=0;j+(1<<i)-1<n;++j) {
st[j][i]=min(st[j][i-1], st[j+(1<<(i-1))][i-1]);
}
}
///solve
sort(x+1,x+1+cntx);
cntx=unique(x+1, x+1+cntx)-x-1;
rep(i,1,cntx+1) val[i<<1]=st[x[i]%n][0];
rep(i,1,cntx) val[i<<1|1]=stMin(x[i]+1, x[i+1]-1);
build(2, cntx<<1, 1);
rep(i,0,q) {
int t=qq[i].t;
int l=qq[i].l;
int r=qq[i].r;
int c=qq[i].x;
int L=lower_bound(x+1, x+1+cntx, l)-x;
int R=lower_bound(x+1, x+1+cntx, r)-x;
if(t==1) {
upd(L<<1, R<<1, c, 2, cntx<<1, 1);
} else {
printf("%d\n",qry(L<<1, R<<1, 2, cntx<<1, 1));
}
}
}
return 0;
}
codeforces 803G Periodic RMQ Problem的更多相关文章
- 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 ...
- (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 803 G. Periodic RMQ Problem
题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...
- 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 528]B. Clique Problem
[codeforces 528]B. Clique Problem 试题描述 The clique problem is one of the most well-known NP-complete ...
- 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 ...
随机推荐
- 各种数据库maven的pom文件编写与ibernate链接配置
各种数据库Hibernate链接配置 Derby db driver maven dependency <dependency> <groupId>org.ap ...
- 记一次接口调用耗时服务端PHP-FPM配置调优
最近测试人员不时有反馈,APP首页打开会出现除了基本的页面布局,需要展示数据的地方都是空白. 想着最近首页接口有过调整,新增数据.会不会是接口改动导致的?? 但APP首页接口都是读取redis的,应该 ...
- UICollectionView二级树展开
公司项目是社区类的,上周就下载了些社区类APP看了下,发现小区无忧首页的顶部蛮好玩,就试着做了一下,现在先把UICollectionView的二级树展开功能分享一下 . 1.效果图 2.创建子Coll ...
- IOS折线图
做项目要统计商品的销售情况,美工那边给了效果图,自己就按照效果图自定义了一个ScrollView.整体效果不错,在做的过程中遇到的问题也记录一下. 现在这个还有许多优化的地方: 1.一个表中只能画一个 ...
- 从零开始学JAVA(08)-使用SpringMVC4 Restful 风格引用静态文件 css/js/png
在写完helloworld后想给网页加点样式(*.css),结果怎么也显示不了,百度了很多种方法后试行尝试,试验成功并记录下来,方便以后查看. 时隔两年,继续学习JAVA,太久没学了,忘记得差不多,还 ...
- 构建流式应用—RxJS详解[转]
目录 常规方式实现搜索功能 RxJS · 流 Stream RxJS 实现原理简析 观察者模式 迭代器模式 RxJS 的观察者 + 迭代器模式 RxJS 基础实现 Observable Observe ...
- jquery实现的让图片在网页的可视区域里四处漂浮的效果
本文分享给大家一个用jquery开发的图片漂浮效果. jquery图片漂浮效果,常见的就是网页里四处漂来漂去的广告了,漂到边缘时还会反弹和拐弯. 下面来看具体的代码,先看要实现漂亮效果的这个jquer ...
- 激活 IntelliJ IDEA
1.点击下面的链接下载 JetbrainsIdesCrack-4.2-release.jar 链接:https://pan.baidu.com/s/1eNY_bwxF7Efl4QG0yh6l1A 提 ...
- RabbitMQ---5、远程 IP 访问
刚刚安装的RabbitMQ-Server-3.3.7,并且也已经开启了Web管理功能,但是现在存在一个问题: 出于安全的考虑,guest这个默认的用户只能通过http://localhost:1567 ...
- Druid SqlParser理解及使用入门
以前的项目中很少去思考SQL解析这个事情,即使在saas系统或者分库分表的时候有涉及到也会有专门的处理方案,这些方案也对使用者隐藏了实现细节. 而最近的这个数据项目里面却频繁涉及到了对SQL的处理,原 ...