Uva 12299 带循环移动的RMQ(线段树)
题目链接:https://vjudge.net/contest/147973#problem/C
题意:传统的RMQ是一个不变的数组a求区间最值。现在要循环移动(往前移动)。
分析:求区间问题,很容易想到线段树,移动就相当于单点更新。
建树,有两种方案,第一种是nlogn,就是不断的更新,更新logn,有n个数。
#include <bits/stdc++.h> using namespace std; const int INF = ;
const int maxnode = <<; int op, qL, qR, p, v; //qL,qR询问区间,p修改点,v修改值 struct IntervalTree
{
int minv[maxnode]; //修改:A[p] = v;
void update (int o,int L,int R)
{
int M = L + (R-L)/;
if(L==R) minv[o] = v;
else
{
if(p<=M) update(o*,L,M);
else update(o*+,M+,R);
minv[o] = min(minv[o*],minv[o*+]);
}
} //询问[ql,qr]中的最小值
int query(int o,int L,int R)
{
int M = L+(R-L)/,ans = INF;
if(qL<=L&&R<=qR) return minv[o];
if(qL<=M) ans = min(ans,query(o*,L,M));
if(M<qR) ans = min(ans,query(o*+,M+,R));
return ans;
} }; IntervalTree tree;
const int maxn = + ;
int A[maxn]; int main()
{
int n,q;
memset(&tree,,sizeof(tree)); scanf("%d%d",&n,&q); for(p=; p<=n; p++)
{
scanf("%d",&v);
A[p] = v;
tree.update(,,n);
} int k,args[],original[];
char cmd[];
while(q--)
{
scanf("%s", cmd);
int len = strlen(cmd);
k = ;
args[k] = ;
for(int i = ; i < len; i++)
{
if(isdigit(cmd[i])) args[k] = args[k] * + cmd[i] - '';
else
{
k++;
args[k] = ;
}
}
if(cmd[] == 'q')
{
qL = args[];
qR = args[];
printf("%d\n", tree.query(, , n));
}
else
{
for(int i = ; i < k; i++) original[i] = A[args[i]];
for(int i = ; i < k; i++)
{
p = args[i];
v = A[p] = original[(i+)%k];
tree.update(, , n);
}
}
}
return ;
}
第二种是有一个build的过程,先将数组存起来,然后build,应用到要维护的信息上去。
#include <bits/stdc++.h> using namespace std; const int INF = ;
const int maxnode = <<; const int maxn = + ;
int A[maxn];
int op, qL, qR, p, v; struct IntervalTree
{
int minv[maxnode]; void build(int o,int L,int R)
{
int M = L + (R-L)/;
if(L==R) minv[o] = A[L];
else
{
build(o*,L,M);
build(o*+,M+,R);
minv[o] = min(minv[o*],minv[o*+]);
}
} //点修改 d[p] =v;
void update(int o,int L,int R)
{
int M = L + (R-L)/;
if(L==R) minv[o] = v;
else
{
if(p<=M) update(o*,L,M);
else update(o*+,M+,R);
minv[o] = min(minv[o*],minv[o*+]);
}
} int query(int o,int L,int R)
{ int M = L + (R-L)/,ans=INF;
if(qL<=L&&R<=qR)
return minv[o]; if(qL<=M) ans = min(ans,query(o*,L,M));
if(M<qR) ans = min(ans,query(o*+,M+,R)); return ans;
} }; IntervalTree tree; int main()
{
int n,q;
scanf("%d%d",&n,&q);
memset(&tree,,sizeof(tree));
for(int i=; i<=n; i++)
scanf("%d",&A[i]);
tree.build(,,n); int k,args[],original[];
char cmd[];
while(q--)
{
scanf("%s", cmd);
int len = strlen(cmd);
k = ;
args[k] = ;
for(int i = ; i < len; i++)
{
if(isdigit(cmd[i])) args[k] = args[k] * + cmd[i] - '';
else
{
k++;
args[k] = ;
}
}
if(cmd[] == 'q')
{
qL = args[];
qR = args[];
printf("%d\n", tree.query(, , n));
}
else
{
for(int i = ; i < k; i++) original[i] = A[args[i]];
for(int i = ; i < k; i++)
{
p = args[i];
v = A[p] = original[(i+)%k];
tree.update(, , n);
}
}
}
return ;
}
Uva 12299 带循环移动的RMQ(线段树)的更多相关文章
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题解: 方法一:贪心. 在草稿纸上试多几次可以知道,删除数字中从左到右最后一位递增(可以等于)的 ...
- UESTC 764 失落的圣诞节 --RMQ/线段树
题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
- VJ16216/RMQ/线段树单点更新
题目链接 /* 单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减. 求[l,r]的和,用sum(r)-sum(l-1).即可. */ #include<cmath> #inc ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- poj2763(lca / RMQ + 线段树)
题目链接: http://poj.org/problem?id=2763 题意: 第一行输入 n, q, s 分别为树的顶点个数, 询问/修改个数, 初始位置. 接下来 n - 1 行形如 x, y, ...
随机推荐
- 复制虚拟机出现”适配器 的mac地址在保留地址范围内‘’
首先我的虚拟机是复制出来的,选择我已经移到,但是结果会出现了以下情况,导致了我无法ping 通,先看下提示: 使用:ipconfig –all 命令查寻,果然再现有打开的虚拟机中,存在两个mac地址相 ...
- HTTP.SYS远程代码执行漏洞测试(ms15-034)
1.HTTP.SYS远程代码执行漏洞简介 首先漏洞编号:CVE-2015-1635(MS15-034 ) 远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未 ...
- TCP/IP协议中几个缩写词的含义 MSL、TTL和RTT 报文最大生存时间 跳数(即生存时间) cs往返时间 MSL要大于TTL知道为什么吗?
MSL.TTL和RTT简介 1.MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃.因为 ...
- 2019.03.20 读书笔记 as is 以及重写隐式/显示
强转.as is 的用法 强制转换类型有两种:子类转基类,重写隐式(implicit )\显示(explicit) 转换操作符 class myclass { private int value; p ...
- Surface Shader(表面着色器)
Shader "Custom/Surface_Shadeer" { Properties { ...
- jemeter接口测试基础
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...
- Node调试之node-inspect工具
1.全局安装node-inspect模块: npm install -g node-inspect 2.通过谷歌浏览器打开:chrome://flags/#enable-devtools-experi ...
- selinux下修改sshd端口号
21 如果已开selinux,修改sshd配置文件 # vim /etc/ssh/sshd_config中的端口号后 重启SSH服务 # systemctl restart sshd.servic ...
- 在线编辑word文档 可保存到服务器
使用说明:该方法只在office xp 和 2003上 测试通过,2000及以下 版本没试. 注意:你要打开的服务器端的word文档要有写权限.iis要开起 web服务扩展中的webdav为允许 具体 ...
- 在线编辑word文档代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...