uva_12299 RMQ with Shifts

原创 2012年03月23日 03:29:28

 RMQ with Shifts 

In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for eachquery (L, R) (L$ \le$R), we report the minimum value among A[L], A[L + 1], ..., A[R]. Note that theindices 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

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.

Input 

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


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

Output 

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

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

#include<stdio.h>
#include<math.h>
#define L(i) i<<1
#define R(i) i<<1|1
#define N 100011
/*
线段树,注意这里是离散的点更新,这些点是有序的,update(l,r,id)中
l、r表示更新的点的下表,若左右孩子都更新时for()寻找断点
状态不佳,l、r的含义糊涂了好久
*/
struct node{
    int l,r,val;
    int mid(){return (l+r)/2;}
}st[N<<2];
int min(int a,int b){
    return a<b?a:b;
}
char str[33];
int a[N],com[33],cnt;
int getcom(){
    int i=6,sum=0,f;
    if(str[0]=='q')
        f=1;
    else
        f=0;
    for(;str[i];++i)
    {
        sum=0;
        for(;str[i]!=','&&str[i]!=')';++i)
            sum=sum*10+(str[i]-'0');//状态不佳,这里写成“+=” RE了无数
        com[cnt++]=sum;

    }
    return f;
}
void build(int l,int r,int id)
{
    st[id].l=l;
    st[id].r=r;
    if(l==r)
    {
        st[id].val=a[l];
        return ;
    }
    int mid=st[id].mid();
    build(l,mid,L(id));
    build(mid+1,r,R(id));
    st[id].val=min(st[L(id)].val,st[R(id)].val);
}
int query(int l,int r,int id)
{
    if(st[id].l==l&&st[id].r==r)
        return st[id].val;
    int mid=st[id].mid();
    if(mid>=r)
        return query(l,r,L(id));
    else if(mid<l)
        return query(l,r,R(id));
    else
        return min(query(l,mid,L(id)),query(mid+1,r,R(id)));
}
void update(int l,int r ,int id)
{
    if(st[id].l==st[id].r)
        st[id].val=a[st[id].l];
    else
    {
        int mid=st[id].mid();
        if(mid>=com[r])
            update(l,r,L(id));
        else if(mid<com[l])
            update(l,r,R(id));
        else
        {
            int i;
            for(i=l;com[i]<=mid;++i);
            update(l,i-1,L(id));
            update(i,r,R(id));
        }
        st[id].val=min(st[L(id)].val,st[R(id)].val);
    }
}
int main()
{
    int n,q,i,t,f;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
        scanf("%d",&a[i]);
    build(1,n,1);
    while(q--)
    {
        scanf("%s",str);
        cnt=0;
        f=getcom();
        if(f)
        {
            printf("%d\n",query(com[0],com[1],1));
        }
        else
        {
            --cnt;
            t=a[com[0]];
            for(i=0;i<cnt;++i)
                a[com[i]]=a[com[i+1]];
            a[com[i]]=t;
            update(0,cnt,1);
        }
    }
    return 0;
}


第七届福建省赛RMQ with Shifts

这道题赤裸裸的线段树,不过就是输入有点难搞,加上错的方式很离谱就写上来了...
  • u012794562
  • u012794562
  • 2014年07月19日 10:00
  • 495

树状数组求最大值 (RMQ with Shifts)

代码: #include #include #include #include using namespace std; const int Max=200010; int RMQ[Max+...
  • yu_zhi_bo_zhi_shui
  • yu_zhi_bo_zhi_shui
  • 2015年08月19日 22:07
  • 419

RMQ with Shifts 线段树基基础

思路 看上去是个线段树,不过每个元素都移动,树结构本身无法实现这个功能,只能一个一个的修改,但是里面的技巧还是有的。学长的代码都上百行了,贴一帖我的60行代码,细节上有点优化处理。 代码 #in...
  • kzzhr
  • kzzhr
  • 2013年08月22日 00:11
  • 1532

RMQ(模板 ST 区间最值,区间频繁次数)

RMQ(模板 ST 区间最值,区间频繁次数)
  • u012860063
  • u012860063
  • 2014年11月03日 22:36
  • 1481

关于RMQ问题的一些感悟

根据询问,修改,单点,区间,在线,离线的各种组合大概有8类问题吧。 一般就是4种解决办法吧。 1、线段树 2、树状数组 3、ST表 4、差分 线段树的话是最万能的方法了...
  • xl2015190026
  • xl2015190026
  • 2017年03月07日 15:57
  • 497

RMQ with Shifts 线段树+点修改

RMQ with Shifts  In the traditional RMQ (Range Minimum Query) problem, we have a static a...
  • u012870383
  • u012870383
  • 2014年07月21日 15:59
  • 326

湖南省第七届程序设计竞赛 RMQ with Shifts

Description In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then fo...
  • u013617636
  • u013617636
  • 2014年08月22日 22:51
  • 419

HDU3183(RMQ问题,ST算法)

题目:A Magic Lamp   题意: 对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的整数最小。 也就是说在A[1...N]中顺次选取N-M个数,使值最小。 本题很有技巧...
  • ACdreamers
  • ACdreamers
  • 2013年03月19日 16:29
  • 2956

数据结构专题小结:RMQ问题

RMQ问题 范围最小值问题(Range Minimum Query)是指:给定一个n个元素的数组A[1],A[2]...A[n]。设计一个数据结构,支持查询操作Query(L,R):计算min{A[L...
  • u014800748
  • u014800748
  • 2015年03月19日 17:09
  • 533

RMQ with Shifts(线段树单点跟新)

Problem Description In the traditional RMQ (Range Minimum Query) problem, we have a static array ...
  • faithdongdong
  • faithdongdong
  • 2014年03月16日 11:00
  • 947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva_12299 RMQ with Shifts
举报原因:
原因补充:

(最多只允许输入30个字)