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

修改的时候由于数据很小,所以可以直接暴力修改,查询的时候利用线段树就行了。

14337858 12299 RMQ with Shifts Accepted C++ 0.282 2014-10-11 16:02:53

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson pos<<1
#define rson pos<<1|1
const int maxn = 111111;
const int  INF = 111111;
int arr[maxn];
int sz;
struct Node{
    int l,r;
    int _min;
}node[maxn <<2];
void BuildTree(int L,int R,int pos){
    node[pos].l = L; node[pos].r = R;
    if(L == R){
        scanf("%d",&node[pos]._min);
        arr[sz ++] = node[pos]._min;
        return ;
    }
    int m = (L + R) >> 1;
    BuildTree(L,m,lson);
    BuildTree(m + 1,R,rson);
    node[pos]._min = min(node[lson]._min,node[rson]._min);
    return;
}
void GetNum(int &l,int &r,char *str){
    int L = strlen(str),j;
    for(j = 0; j < L; j++){
        if(str[j] >= '0' && str[j] <= '9'){
            l = l * 10 + (str[j] - '0');
        }
        else if(l)
            break;
    }
    for(;j < L; j++){
        if(str[j] >= '0' && str[j] <= '9'){
            r = r * 10 + str[j] - '0';
        }
        else if(r)
            break;
    }
    return ;
}
int Query(int L,int R,int pos){
    if(L <= node[pos].l && node[pos].r <= R)
        return node[pos]._min;
    int m = (node[pos].l + node[pos].r) >> 1;
    int ret = INF;
    if(L <= m)
        ret = min(ret,Query(L,R,lson));
    if(R  > m)
        ret = min(ret,Query(L,R,rson));
    return ret;
}
void UpDate(int aim,int value,int pos){
    if(node[pos].l == node[pos].r){
        node[pos]._min = value;
        return ;
    }
    int m = (node[pos].l + node[pos].r) >> 1;
    if(aim <= m)
        UpDate(aim,value,lson);
    else
        UpDate(aim,value,rson);
    node[pos]._min = min(node[lson]._min,node[rson]._min);
    return;
}
int main(){
    int n,q;
    while(scanf("%d%d",&n,&q) != EOF){
        sz = 1;
        BuildTree(1,n,1);
        char str[100];
        int array[30];
        for(int x = 0; x < q; x++){
            scanf("%s",str);
            if(str[0] == 'q'){
                int l = 0,r = 0;
                GetNum(l,r,str);
                printf("%d\n",Query(l,r,1));
            }
            else{
                memset(array,0,sizeof(array));
                int size = 0, n = strlen(str);
                for(int j = 0 ; j < n; j++){
                    if(str[j] >= '0' && str[j] <= '9'){
                        array[size] = array[size] * 10 + str[j] - '0';
                    }
                    else if(array[size] != 0){
                        size ++;
                    }
                }
                //左移一位
                int temp = arr[array[0]];
                for(int i = 0; i < size; i++){
                    int e;
                    if(i < size - 1){
                        UpDate(array[i],arr[array[i + 1]],1);
                        arr[array[i]] = arr[array[i + 1]];
                    }
                    else{
                        UpDate(array[i],temp,1);
                        arr[array[i]] = temp;
                    }
                }
            }
//            for(int i = 1 ;i <= n; i++) printf("%d ",arr[i]);
//            printf("\n");
        }
    }
    return 0;
}
时间: 2024-11-05 06:20:20

【UVA】12299-RMQ with Shifts(线段树)的相关文章

UVa 12299 RMQ with Shifts(线段树)

线段树,没了.. ----------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cctype> #define rep(i,n) for(int i=0;i<n

Uva 12299 RMQ with Shifts(线段树 + 单点更新 )

Uva 12299 RMQ with Shifts (线段树 + 单点更新) 题意: 对于给定的序列 x[i]给出一个操作 shift(a,b,c,d,e) 对应的是将 x[a]与x[b] x[b]与x[c] 这样相邻的两两交换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

UVa 12299 RMQ with Shifts(移位RMQ)

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], ...,

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师

uva 12299 RMQ with Shifts (简单线段树)

传送门:点击打开链接 题目大意: 对一个数组有2种操作. 1:左移,将给定的几个位置左移. 2:求区间最小值. 解题思路: 左移...呵呵 么见过.怎么搞.再读读题.然后惊讶的发现.Each operation is formatted as a string having no more than 30 characters 那就好办了.弄成单点更新就OK了!

UVA - 11983 Weird Advertisement (线段树求并面积)

Description G Weird Advertisement Renat Mullakhanov (rem), one of the most talented programmers in the world, passed away on March 11, 2011. This is very sad news for all of us. His team went to ACM ICPC World Finals - 2004, placed 4th and won gold m

UVA 11983 Weird Advertisement(线段树求矩形并的面积)

UVA 11983 题目大意是说给你N个矩形,让你求被覆盖k次以上的点的总个数(x,y<1e9) 首先这个题有一个转化,吧每个矩形的x2,y2+1这样就转化为了求N个矩形被覆盖k次以上的区域的面积 由于坐标很大,首先考虑的就是将坐标离散化,然后建立线段树tree[][K],表示x的某个区间被覆盖了K次(大于K次算K次)的实际长度,在计算时把矩形转化为一系列横线段(就是说将一个矩形拆开为两条线段,下面的标记为1,上面的标记为-1(这里的标记很有技巧)),然后将这些线段按照y值的从小到达排序(y值相

hdu1823 Luck and Love 二维RMQ(二维线段树)

题意:给定你二维范围,找这个范围里面的最大值 解题思路:二维线段树有两种实现方式,一种是  树套树  ,另一种则是将二维平面分成4块的  完全四叉树 我的代码: // File Name: 1823.cpp // Author: darkdream // Created Time: 2014年07月10日 星期四 09时38分05秒 #include<vector> #include<list> #include<map> #include<set> #in

POJ 3368 Frequent values RMQ ST算法/线段树

                                                     Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15229   Accepted: 5550 Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In

uva 1492 - Adding New Machine(线段树)

题目链接:uva 1492 - Adding New Machine 题目大意:在一个R?C矩阵上有N台旧的机器,给定每个机器的占地,现在要添加一台1?M的机器,问有多少种摆放方法. 解题思路:问题可以转化成矩形覆盖问题,对于每台旧的机器,假设考虑对应每个位置向右放,那么左边的M-1个位置是不能放的,以及右边界左边的M-1个位置.用线段树解决矩形覆盖,x,y坐标分别处理一次.注意M=1的情况. #include <cstdio> #include <cstring> #includ