UVa 12299 - RMQ with Shifts(移位RMQ)

Time limit: 1.000 seconds


Description - 题目描述

In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each query (L,R) (L ≤ R), we report the minimum value among A[L], A[L + 1], ..., A[R]. Note that the indices start from 1, i.e. the left-most element is A[1]. In this problem, the array A is no longer static: we need to support another operation

在经典的RMQ(区间最值)问题中,给定数组A。对于每个询问(L,R) (L ≤ R),输出A[L], A[L + ], ..., A[R]中的最小值。注意下标从1开始,即最左边的元素为A[]。在这个问题中,数组A会发生些许变化:定义如下操作

CN

shift(i1, i2, i3, ...,ik) (i1 < i2 < ... < ik, k > 1)

we do a left “circular shift” of A[i1], A[i2], ..., A[ik]. For example, if A={6, 2, 4, 8, 5, 1, 4}, then shift(2,4,5,7) yields {6, 8, 4, 5, 4, 1, 2}. After that,shift (1,2) yields 8, 6, 4, 5, 4, 1, 2.

我们对A[i1], A[i2], ..., A[ik]执行循环左移。例如,A={, , , , , , },则经过shift(,,,)后得到 {, , , , , , }。再经过shift (,)得到8, , , , , , 。

CN

Input - 输入

There will be only one test case, beginning with two integers n, q (1 ≤ n ≤ 100,000, 1 ≤ q ≤ 250,000), the number of integers in array A, and the number of operations. The next line contains n positive integers not greater than 100,000, the initial elements in array A. Each of the next q lines contains an operation. Each operation is formatted as a string having no more than 30 characters, with no space characters inside. All operations are guaranteed to be valid.

Warning: The dataset is large, better to use faster I/O methods.

只有一组测试用例,起始位置有两个整数n, q ( ≤ n ≤ ,,  ≤ q ≤ ,),分别表示整数数组A中的元素个数,询问的数量。下一行有n个不超过100,000的非负数,皆为数组A中的初始元素。随后q行每行包含一个操作。每个操作皆为一个不超过30个字符的字符串,且不含空格。全部操作均正确有效。

注意:数据量很大,最好使用更快的I/O函数。

CN

Output - 输出

For each query, print the minimum value (rather than index) in the requested range.

对于每个询问,输出待求范围的最小值(非下标)。

CN

Sample Input - 输入样例

7 5
6 2 4 8 5 1 4
query(3,7)
shift(2,4,5,7)
query(1,4)
shift(1,2)
query(2,2)

Sample Output - 输出样例

1
4
6

题解

一般的线段树。

虽然说数据量大,意思也就不能用cin吧,scanf还是可以A的。

一开始还以为需要用延迟更新,然后想了想30*25W的O(NlogN)还是应该可以的,能简则简。

代码中用的是自下往上的更新方式,目测比从上往下略快,可以跳过部分更新。

代码 C++

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define mx 100005
int tr[mx << ], path[mx], iP, ts[mx];
int build(int L, int R, int now){
if (L > R) return mx;
if (L == R) scanf("%d", tr + (path[++iP] = now));
else{
int mid = L + R >> , cL, cR;
cL = build(L, mid, now << ); cR = build(mid + , R, now << | );
tr[now] = std::min(cL, cR);
}
return tr[now];
}
int query(int L, int R, int now, int edL, int edR){
if (edL <= L && R <= edR) return tr[now];
int mid = L + R >> , cL, cR;
if (edR <= mid) return query(L, mid, now << , edL, edR);
if (mid < edL) return query(mid + , R, now << | , edL, edR);
cL = query(L, mid, now << , edL, mid); cR = query(mid + , R, now << | , mid + , edR);
return std::min(cL, cR);
}
void updata(int now, int n){
int tmp, cL, cR;
while (now >>= ){
tmp = std::min(tr[now << ], tr[now << | ]);
if (tmp == tr[now]) return;
tr[now] = tmp;
}
}
int main(){
memset(tr, , sizeof(tr));
int n, q, i, j, tmp;
char op[];
scanf("%d%d", &n, &q);
build(, n, ); getchar();
while (q--){
fread(op, sizeof(char), , stdin);
if (*op == 'q'){
for (i = ; i < ; ++i) scanf("%d", ts + i), getchar();
printf("%d\n", query(, n, , ts[], ts[]));
}
else{
for (j = ; *op != ')'; ++j) scanf("%d", ts + j), *op = getchar();
for (tmp = tr[path[ts[i = ]]]; i < j - ; ++i){
tr[path[ts[i]]] = tr[path[ts[i + ]]];
updata(path[ts[i]], n);
}
tr[path[ts[i]]] = tmp;
updata(path[ts[i]], n);
}
getchar();
}
return ;
}

UVa 12299 RMQ with Shifts(移位RMQ)的更多相关文章

  1. UVa 12299 线段树 单点更新 RMQ with Shifts

    因为shift操作中的数不多,所以直接用单点更新模拟一下就好了. 太久不写线段树,手好生啊,不是这错一下就是那错一下. PS:输入写的我有点蛋疼,不知道谁有没有更好的写法. #include < ...

  2. Uva 12299 带循环移动的RMQ(线段树)

    题目链接:https://vjudge.net/contest/147973#problem/C 题意:传统的RMQ是一个不变的数组a求区间最值.现在要循环移动(往前移动). 分析:求区间问题,很容易 ...

  3. UVa 12299 RMQ with Shifts(线段树)

    线段树,没了.. ----------------------------------------------------------------------------------------- # ...

  4. TOJ 4325 RMQ with Shifts / 线段树单点更新

    RMQ with Shifts 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 描述 In the traditional RMQ (Range M ...

  5. nyoj 568——RMQ with Shifts——————【线段树单点更新、区间求最值】

    RMQ with Shifts 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     In the traditional RMQ (Range Minimum Q ...

  6. RMQ with Shifts(线段树)

    RMQ with Shifts Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Pra ...

  7. C. RMQ with Shifts

    C. RMQ with Shifts Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 131072KB   64-bit intege ...

  8. uva 100 The 3n + 1 problem (RMQ)

    uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= ...

  9. 【UVA】12299-RMQ with Shifts(线段树)

    改动的时候因为数据非常小,所以能够直接暴力改动,查询的时候利用线段树即可了. 14337858 option=com_onlinejudge&Itemid=8&page=show_pr ...

随机推荐

  1. [转]从网页Web上调用本地应用程序(.jar、.exe)的主流处理方法

    这个方法主要思路是利用自定义URL Protocol来调用应用程序.浏览器在解析到自定义URL Protocol之后,会寻找注册表,然后通过注册表启动相应的程序,然后启动改程序,传入参数.对于我这个项 ...

  2. Java Web(转)

    struts2+spring+hibernate 上传文件 关 键字: s2sh 上传文件 struts2 spring hibernate 前段时间,我用struts2.1.6.spring2.5. ...

  3. IHttpModule

    随便写一个类继承IHttpModule 实现IHttpModule中的两个方法 Init() Dispose() public void Init(HttpApplication context) { ...

  4. jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()的区别

      body中的onload()和window.onload以及$(document).ready()的区别: 1.前两者都表示当页面加载元素(包括图片等信息)完毕后执行的操作,而且两者在各种浏览器中 ...

  5. java调用 webservices接口实现天气预报

    最近要用到web services,而这两天也比较有空,就弄了一个获取天气预报的Util.以前以为这有多难,因为数据来源是个困难.现在用web services的技术,发现下面这个是相当不错的.下面就 ...

  6. HttpURLConnection请求

    方法调用: //测试 public static void main(String[] args) { Map map = new HashMap(); map.put("type" ...

  7. Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...

  8. (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句 在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREA ...

  9. 如何快速建立一个测试资源Web服务器及异步获取资源(Unity3D)

    背景 1.最近看了几位专栏作家的文章,几篇提到了资源通过网络的动态获取.如何建立一个快速的测试环境,不免是一个问题,也就最简单的就是假设http服务器了,微软系的当然首选的IIS了,别的也能用阿帕奇或 ...

  10. 函数nvl 和decode

    decode(nvl(kkc.category, 'one'),'one','普通','two','精品','three','行业','four','白金')