uva 12299 RMQ with Shifts

本文介绍了一种基于区间树的数据结构实现方法,包括构建、更新及查询操作。通过具体的代码示例,详细展示了如何利用区间树进行有效的区间最小值查询及区间元素更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=100000+5;
 6 int num[maxn<<4];
 7 int tmp[maxn];
 8 int indice[50];
 9 int tot;
10 void push_up(int rt)
11 {
12     num[rt]=min(num[rt<<1],num[rt<<1|1]);
13 }
14 void build(int l,int r,int rt)
15 {
16     if(l==r)
17     {
18         scanf("%d",&num[rt]);
19         tmp[tot++]=num[rt];
20         return ;
21     }
22     int m=(l+r)>>1;
23     build(l,m,rt<<1);
24     build(m+1,r,rt<<1|1);
25     push_up(rt);
26 }
27 void update(int x,int y,int l,int r,int rt)
28 {
29     if(l==r)
30     {
31         num[rt]=y;
32         return ;
33     }
34     int m=(l+r)>>1;
35     if(x<=m) update(x,y,l,m,rt<<1);
36     else update(x,y,m+1,r,rt<<1|1);
37     push_up(rt);
38 }
39 int query(int L,int R,int l,int r,int rt)
40 {
41     if(L<=l&&r<=R)
42     {
43         return num[rt];
44     }
45     int m=(l+r)>>1;
46     if(R<=m) return query(L,R,l,m,rt<<1);
47     if(L>m) return query(L,R,m+1,r,rt<<1|1);
48     int a=query(L,R,l,m,rt<<1);
49     int b=query(L,R,m+1,r,rt<<1|1);
50     return min(a,b);
51 }
52 int main()
53 {
54     int n,q;
55     scanf("%d%d",&n,&q);
56     tot=1;
57     build(1,n,1);
58     while(q--)
59     {
60         getchar();
61         int cnt=0;
62         char cmd;
63         cmd=getchar();
64         if(cmd=='q')
65         {
66             while(cmd!='(')
67                     cmd=getchar();
68             while(cmd!=')')
69                 scanf("%d%c",&indice[cnt++],&cmd);
70             printf("%d\n",query(indice[0],indice[1],1,n,1));
71         }
72         else
73         {
74             while(cmd!='(')
75                     cmd=getchar();
76             while(cmd!=')')
77                 scanf("%d%c",&indice[cnt++],&cmd);
78             int temp=tmp[indice[0]];
79             for(int i=0;i<cnt-1;i++)
80                 tmp[indice[i]]=tmp[indice[i+1]];
81             tmp[indice[cnt-1]]=temp;
82             for(int i=0;i<cnt;i++)
83                 update(indice[i],tmp[indice[i]],1,n,1);
84         }
85     }
86     return 0;
87 }

 

转载于:https://www.cnblogs.com/sooflow/p/3307558.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值