RMQ with Shifts
点击打开链接
题意:输入n,q,输入n个数,q个查询
query(l,r)查询[l,r]区间的最小的
shift(i1,i2,i3,···,ik)
把i1位置的数改成a[i2],
a[i1]与a[i2]互换数值;
把i2位置上的数改成a[i3];
a[i2]与a[i3]互换数值
思路:裸线段树,竟然wa5次,错在了,update(1,b[k],a[b[k]]);一开始update(1,b[k],a[b[k-1]]),这是不对的,因为我已经把a[b[k]],与a[b[k-1]]互换数值了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
int a[maxn];
struct Tree
{int left,right,minn;
};
Tree tree[maxn<<2];
void build(int id,int l,int r)
{tree[id].left=l;tree[id].right=r;if(l==r)tree[id].minn=a[l];else{int mid=(l+r)>>1;build(id*2,l,mid);build(id*2+1,mid+1,r);tree[id].minn=min(tree[id*2].minn,tree[id*2+1].minn);}
}
void update(int id,int pos,int val)
{if(tree[id].left==tree[id].right)tree[id].minn=val;else{int mid=(tree[id].left+tree[id].right)>>1;if(pos<=mid)update(id*2,pos,val);elseupdate(id*2+1,pos,val);tree[id].minn=min(tree[id*2].minn,tree[id*2+1].minn);}
}
int query(int id,int l,int r)
{if(tree[id].left==l&&tree[id].right==r)return tree[id].minn;else{int mid=(tree[id].left+tree[id].right)>>1;if(r<=mid)query(id*2,l,r);else if(l>mid)query(id*2+1,l,r);elsereturn min(query(id*2,l,mid),query(id*2+1,mid+1,r));}
}
int main()
{int n,q,i,j,l,r,b[50],k,ans,t;char s[50];scanf("%d%d",&n,&q);for(i=1;i<=n;i++)scanf("%d",&a[i]);build(1,1,n);while(q--){//cin>>s;scanf("%s",s);if(s[0]=='q'){l=0;r=0;for(i=6;i<strlen(s);i++){if(s[i]==','){j=i+1;break;}elsel=l*10+s[i]-'0';}for(;j<strlen(s);j++){if(s[j]==')')break;r=r*10+s[j]-'0';}ans=query(1,l,r);printf("%d\n",ans);}else{t=0;k=0;for(i=6;i<strlen(s);i++){if(s[i]==','){b[++k]=t;t=0;}else if(s[i]==')'){b[++k]=t;}elset=t*10+s[i]-'0';}for(i=1;i<=k-1;i++){update(1,b[i],a[b[i+1]]);t=a[b[i+1]];a[b[i+1]]=a[b[i]];a[b[i]]=t;}update(1,b[k],a[b[k]]);}}
}
RMQ with Shifts相关推荐
- UVA 12299 RMQ with Shifts 线段树
简单的单点更新 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> # ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- RMQ问题(线段树算法,ST算法优化)
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...
- HDU - 6305 RMQ Similar Sequence(笛卡尔树)
http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...
- 【uva10829-求形如UVU的串的个数】后缀数组+rmq or 直接for水过
题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&am ...
- hdu 2459 (后缀数组+RMQ)
题意:让你求一个串中连续重复次数最多的串(不重叠),如果重复的次数一样多的话就输出字典序小的那一串. 分析:有一道比这个简单一些的题spoj 687, 假设一个长度为l的子串重复出现两次,那么它必然会 ...
- bzoj 2006 [NOI2010]超级钢琴 rmq+堆
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 3708 Solved: 1846 [Submit][Sta ...
- hicoder - 1068 【RMQ or 线段树】
hicoder - 1068 [RMQ or 线段树] RMQ: 1 #include <bits/stdc++.h> 2 #define rep(i,a,b) for(int i = a ...
最新文章
- 线性求[1,P-1]的逆元
- 《BI那点儿事》三国人物智力分布状态分析
- 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
- mysql5.5以上my.ini中设置字符集
- 机器学习小抄.pdf(像背托福单词一样理解机器学习)
- Python | 常见的反爬及解决方法,值得收藏
- 吃是为了肉体,喝是为了灵魂
- Atitit. C# java 的api 目录封装结构映射总结
- linux如何设置显示器亮度调节软件,为 Linux 启用色温和亮度调节工具
- 年终工作总结目录结构和要点
- redhat红帽官方软件仓库同步方案
- linux thinkphp5 php7.0禁用eval
- Chrome插件开发学习心得(一)之前期开发
- 用计算机创造一个宇宙,人工智能令整个宇宙变成一个玄计算机,宇宙是虚拟的,真实世界...
- 车载播放器 android,KX万能播放器
- 京东内部资料【自然搜索排序白皮书】打算混京东的屌丝必看!
- es java api 查询_es聚合查询javaapi
- 产品定位的原则,与同类产品竞争原则、拾遗补缺原则等5个方面
- Arcgis利用dem数据生成等高线
- java中提示确认_javascript对话框使用方法(警告框 javascript确认框 提示框)
热门文章
- 台式计算机年限怎么看,电脑使用年限_电脑使用年限查询
- 用ANSYS画矩形_用SolidWorks画一个带波浪纹路的瓶子
- python自动化办公入门书籍-Python如此神奇,让繁琐工作自动化 (文中含Python基础)...
- python编程教学视频-【科研资源03】最全Python编程全套系统视频学习教程
- 一张图学会python高清图-一张图带你学会Python,学习Python的非常简单,附教程
- python自动化办公excel-自动化办公:python操作Excel
- python零基础入门视频免费-阿里云免费推出Python零基础入门在线教程视频
- python可以给你干什么-Python可以用来做什么 为你揭开python神秘面纱
- 手握14万,博越是最佳选?这车配钢炮动力,可双屏互动,不香?
- 北京理工大学语音识别技术.ppt