树状数组求最大值 (RMQ with Shifts)
2017-07-23 15:11
295 查看
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; const int Max=200010; int RMQ[Max+10]; int total[Max]; int sum[35]; int N,M,cnt; char ctr[35]; int bit(int x) {//每一个下标管辖的范围 return x&(-x); } int query(int first,int second) {//查询 int res=total[second]; while(first<=second) { int key=bit(second); if(second-key>=first) { if(res>RMQ[second]) res=RMQ[second]; second=second-key; } else { if(res>total[second]) res=total[second]; second--; } } return res; } int updata(int x) {//更新x位置节点 for(int i=x;i<=N;i+=bit(i)) { RMQ[i]=total[i];//利用原数组来更新树状数组 for(int j=1;j<bit(i);j<<=1) {//这个是重点又一次扫描i节点所管辖的区间 RMQ[i]=min(RMQ[i],RMQ[i-j]); } } } void solve() { int len=strlen(ctr); cnt=0; memset(sum,0,sizeof(sum)); for(int i=6; i<len; i++) { if(ctr[i]==')') break; if(ctr[i]==',') { cnt++; continue; } int t=ctr[i]-'0'; sum[cnt]=t+sum[cnt]*10; } if(ctr[0]=='q') printf("%d\n",query(sum[0],sum[1])); else { int key=total[sum[0]]; for(int i=cnt; i>=0; i--) { int q=total[sum[i]]; total[sum[i]]=key;//先更新原数组 updata(sum[i]); key=q; } } } int main() { scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) { scanf("%d",&total[i]); updata(i); } for(int i=0;i<M;i++) { scanf("%s",ctr); solve(); } return 0; }
相关文章推荐
- 树状数组求最大值 (RMQ with Shifts)
- HDU4267 A Simple Problem with Integers(树状数组 离散化)
- TOJ 4283 Gifts with different style / 线段树 树状数组 背包
- LCA + 树状数组 + 树上RMQ
- [LeetCode] Number of Subarrays with Bounded Maximum 有界限最大值的子数组数量
- RMQ with Shifts
- 玲珑学院OJ 1023 - Magic boy Bi Luo with his excited math problem 树状数组暴力
- RMQ with Shifts
- 湖南省第七届程序设计竞赛 RMQ with Shifts
- POJ3468--A Simple Problem with Integers--线段树/树状数组 改段求段
- uva 12299 RMQ with Shifts(线段树单点更新初步应用)
- POJ 3468_A Simple Problem with Integers(树状数组)
- RMQ模板 求区间最大、最小值。 (前提是数组一旦确定便不再频繁更改)
- HDU 1559 最大子矩阵 [二维树状数组]【数据结构】
- UVA 12299 RMQ with Shifts(线段树+点更新)
- UVA 12299 RMQ with Shifts(线段树单点更新,最值查询)
- LCA + 树状数组 + 树上RMQ
- nyoj 119 士兵杀敌(三) <模板RMQ--静态数组时求最大最小值>
- BZOJ 1012: [JSOI2008]最大数maxnumber 树状数组求最值
- RMQ with Shifts