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;
}


相关文章推荐

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

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

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

RMQ with Shifts Description In the traditional RMQ (Range Minimum Query) problem, we have ...

(TLE待AC)CSU 1110 RMQ with Shifts

1110: RMQ with Shifts Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 298  Solved: 66 [Submit][...

RMQ with Shifts 线段树基基础

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

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

RMQ with Shifts  In the traditional RMQ (Range Minimum Query) problem, we have a static...
  • cyendra
  • cyendra
  • 2013年05月14日 15:32
  • 1132

湖南省第七届大学生计算机程序设计竞赛 RMQ with Shifts (线段树)

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

RMQ with Shifts

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

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

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

UVA 12299 RMQ with Shifts(线段树)

题目大意:第一行输入两个整数(数据个数,操作个数),query(a,b)为查找区间a到b的最小值,并输出。shift(a,b,c,d...)为将a,b,c,d...全部循环左移。 解析:线段树的...

UVA 12299 RMQ with Shifts

线段树。单点更新,区间查询。就是说每次更新时,就按照题意,一个一个去修改。一开始我认为这样做会超时,跟队友商量了一下,也都认为会超时,但又想不到别的方法。。。。百度了一下,别人都说是水题,简单模板题,...
  • wjf1514
  • wjf1514
  • 2013年09月30日 18:22
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva_12299 RMQ with Shifts
举报原因:
原因补充:

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