题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3720

题意:给你一个可变的数组A,有两种操作。操作一:shift(i1, i2....in),将数组中这些元素的值变为(A[i2], A[i3]....A[in], A[i1]),操作二:Query(L, R),

查询A[i](L<=i <=R)的和。

题中 Each operation is formatted as a string having no more than 30 characters, 暗示每次参与shift操作的元素不多,所以直接可以使用单点更新的方式来解决问题。

#include <iostream>
#include <cstring>
#include <algorithm>
#define maxn 100010
#define maxl 50
#define inf 1000000000
#define LL(x) x<<1
#define RR(x) x<<1|1
using namespace std; typedef long long LL; //variable define struct tree
{
int l, r;
int mi;
}; tree node[maxn<<];
int n, m, arr[maxn], tmp[maxl], tot; //function define void push_up(int x); void build_tree(int left, int right, int x); int query(int left, int right, int x); void update(int left, int right, int x, int val); void solve(); bool is_number(char ch); int main(void)
{
while (scanf("%d %d", &n, &m) != EOF)
{
tot = ;
build_tree( , n, );
solve();
}
return ;
} void build_tree(int left, int right, int x)
{
node[x].l = left;
node[x].r = right; if (left == right)
{
scanf("%d", &node[x].mi);
arr[tot++] = node[x].mi;
return;
} int lx = LL(x);
int rx = RR(x);
int mid = left + (right - left)/;
build_tree(left, mid, lx);
build_tree(mid + , right, rx);
push_up(x);
} void push_up(int x)
{
if (node[x].l >= node[x].r)
return; int lx = LL(x);
int rx = RR(x);
node[x].mi = min( node[lx].mi, node[rx].mi);
} void update(int left, int right, int x, int val)
{
if (node[x].l == left && node[x].r == right)
{
node[x].mi = val;
return;
}
int lx = LL(x);
int rx = RR(x);
int mid = node[x].l + (node[x].r - node[x].l)/;
if (right <= mid)
update(left, right, lx, val);
else if (left > mid)
update(left, right, rx, val);
else
{
update(left, mid, lx, val);
update(mid + , right, rx, val);
}
push_up( x);
} int query(int left, int right, int x)
{
if (node[x].l == left && node[x].r == right)
{
return node[x].mi;
}
int mid = node[x].l + (node[x].r - node[x].l)/;
int lx = LL(x);
int rx = RR(x);
if (right <= mid)
return query(left, right, lx);
else if (left > mid)
return query(left, right, rx);
else
return min( query(left, mid, lx), query(mid + , right, rx));
} void solve()
{
char str[];
while (m--)
{
int x = , y = , ind;
scanf("%s", str);
if (str[] == 'q')
{
ind = ;
while (!is_number(str[ind]))
ind++;
x = ;
while (is_number(str[ind]))
{
x *= ;
x += str[ind] - '';
ind++;
}
while (!is_number(str[ind]))
ind++;
y = ;
while (is_number(str[ind]))
{
y *= ;
y += str[ind] - '';
ind++;
}
printf("%d\n", query( x, y, ));
}
else
{
ind = , tot = ;
while (str[ind] != ')')
{
if (is_number(str[ind]))
{
x = ;
while (is_number(str[ind]))
{
x *= ;
x += str[ind] - '';
ind++;
}
tmp[tot++] = x;
}
else
ind++;
} int swap = arr[tmp[]];
for (int i = ; i < tot - ; ++i)
arr[tmp[i]] = arr[tmp[i+]];
arr[tmp[tot - ]] = swap;
for (int i = ; i < tot; ++i)
{
update( tmp[i], tmp[i], , arr[tmp[i]]);
}
}
}
} bool is_number(char ch)
{
if (ch >= '' && ch <= '')
return true;
return false;
}

UVA 12299 RMQ with Shifts(线段树:单点更新)的更多相关文章

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

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

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

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

  3. HDU 1754 - I Hate It & UVA 12299 - RMQ with Shifts - [单点/区间修改、区间查询线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...

  4. UVa 12299 RMQ with Shifts(移位RMQ)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...

  5. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  6. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  7. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  8. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Descrip ...

  10. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

随机推荐

  1. 预测帖 苹果在2年之内会换Arm

    这几天看了iPad Pro和新的macbook, 我个人预测,苹果2年之内必换Arm处理器 首先会是笔记本. 而且会把软件移植也做的很好,不需要怎么改代码,只需要编译的时候加入相应的cpu就可以.至于 ...

  2. 基于sentinel 的redis集群环境搭建

    环境信息,三台机器,一台master,两台slave,每台机器上启动一个sentinel master 192.168.1.106 slave1 192.168.1.102 slave2 192.16 ...

  3. I/O流——其他流

    其他流 一.ObjectInputStream/ObjectOutputStream ① ObjectInputStream和ObjectOutputStream分别与FileInputStream和 ...

  4. 检查项目里是否有IDFA的方法

    检查项目里是否有IDFA的方法: 步骤:1.打开终端cd到要检查的文件的根目录. 2.执行下列语句:grep -r advertisingIdentifier . (别少了最后那个点号). 发现有ma ...

  5. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  6. ajax 请求如何解决乱码

    今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题. 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custI ...

  7. 关于onmouseover和onmouseout的bug

    总结了一下关于使用onmouseover以及onmouseout会出现的bug 首先简单的布局: <div id="box"> <div>这是一个内容< ...

  8. npm 加速方案

    使用npm install 包,是见比较头疼的事情,比较慢,很难等,经过探索,还是发现有办法加速的,方法有两个,让我一一道来: 1. 在npm 后添加参数 --registry=... 指定镜像源地址 ...

  9. 第六章 springboot + 事务(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...

  10. eval回显变量

    eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变量. 一个应用场景如下: export path="/home/bin/" ...