NYOJ-568/1012//UVA-12299RMQ with Shifts,线段树单点更新+区间查询
来源:互联网 发布:网络被诋毁诽谤怎么办 编辑:程序博客网 时间:2024/04/29 06:04
RMQ with Shifts
时间限制:1000 ms | 内存限制:65535 KB
难度:3
-> Link1 <-->Link2 <-
以上两题题意是一样的,只不过数据范围有所改动,代码改一下数组大小直接水过;
思路:典型的线段数单点更新+区间查询,只不过题目改动了一下,没有直接给出更新数据和查询区间,而是用字符串输入,所以只能将数据提取出来再进行操作,这道题线段数能做那么用RMQ肯定也能做,而且可能还更简洁;过的人并不多,大神们快点去A了它吧;
#include<bits/stdc++.h>using namespace std;const int N=100000+10;struct node{ int l,r,mi;} a[N<<2];int s[N],n,m;void build(int l,int r,int k){ a[k].l=l,a[k].r=r,a[k].mi=0; if(l==r) { a[k].mi=s[l]; return ; } int mid=(l+r)/2; build(l,mid,2*k); build(mid+1,r,2*k+1); a[k].mi=min(a[k*2].mi,a[k*2+1].mi);}void update(int x,int n,int k){ if(a[k].l==a[k].r&&a[k].l==x) { a[k].mi=n; return ; } int mid=(a[k].l+a[k].r)/2; if(x<=mid) update(x,n,2*k); else update(x,n,2*k+1); a[k].mi=min(a[k*2].mi,a[k*2+1].mi);}int query(int l,int r,int k){ if(a[k].l==l&&a[k].r==r) return a[k].mi; int mid=(a[k].l+a[k].r)/2; a[k].mi=min(a[k*2].mi,a[k*2+1].mi); if(r<=mid) return query(l,r,2*k); else if(l>mid) return query(l,r,2*k+1); return min(query(l,mid,2*k),query(mid+1,r,2*k+1));}int main(){ int i; scanf("%d%d",&n,&m); for(i=1; i<=n; i++) scanf("%d",&s[i]); build(1,n,1); char sb[120]; while(m--) { scanf("%s",sb); int len=strlen(sb); if(sb[0]=='q') { int x=0,y=0; for(i=6; sb[i]!=','; i++) x=x*10+(sb[i]-'0');//区间左端点; for(i++; sb[i]!=')'; i++) y=y*10+(sb[i]-'0');//右端点; printf("%d\n",query(x,y,1)); } else { int x=0,y=0,k=6,pos=0; for(i=k; sb[i]!=','; i++) x=x*10+(sb[i]-'0');//第一个x; pos=s[x]; while(k!=len-1) { for(i++; sb[i]>='0'&&sb[i]<='9'; i++)//跳出的条件是sb[i]要么是','要么是')'; y=y*10+(sb[i]-'0'); update(x,s[y],1); s[x]=s[y];//注意这里也要进行更新; k=i; x=y,y=0; } update(x,pos,1); s[x]=pos;//小细节,注意; } } return 0;}RMQ还是停留在模板水平,如果有更多应用的话还会在学的;
0 0
- NYOJ-568/1012//UVA-12299RMQ with Shifts,线段树单点更新+区间查询
- 12299 - RMQ with Shifts(线段树单点更新、区间求最值)
- UVa 12299 - RMQ with Shifts 线段树 单点更新
- uva 12299 - RMQ with Shifts--- 线段树单点更新
- UVA - 12299 RMQ with Shifts (线段树:单点修改,区间查询)
- UVa 12299 RMQ with shifts(线段树单点修改 区间查询)
- UVA 12299 RMQ with Shifts(线段树单点更新,最值查询)
- UVA12299 RMQ with Shifts 线段树查询 单点更新
- uva 12299 RMQ with Shifts(线段树单点更新初步应用)
- UVA 12299 RMQ with Shifts(线段树+点更新)
- CSU-1110 RMQ with Shifts (单点更新+区间最小值 zkw线段树)
- UVA 12299 - RMQ with Shifts 线段树
- UVA 12299 - RMQ with Shifts(线段树)
- uva 12299 - RMQ with Shifts(线段树)
- UVA 12299 RMQ with Shifts 线段树
- UVa 12299 RMQ with Shifts(线段树)
- UVA 12299 RMQ with Shifts(线段树)
- Uva 12299 线段树求区间最小值(RMQ) 区间查询单点更新
- Linux 安装 Oracle 11g——准备工作
- Python 基础入门
- L2-012. 关于堆的判断
- 修改DEDECMS织梦标题字数限制的方法
- RabbitMQ 3.6.3 bug bug bug
- NYOJ-568/1012//UVA-12299RMQ with Shifts,线段树单点更新+区间查询
- Java中的异常总结
- spark streaming 读取网络数据
- 将子div在父div中固定在底部(类似剩余电量的效果)
- bzoj 3224: Tyvj 1728 普通平衡树(splay 模板题)
- ArrayList集合中的字符串数据存储到文本文件|文本文件中读取数据到集合
- 在leangoo里怎么插入泳道,上下移动泳道和删除泳道?
- HBase shell 使用SingleColumnValueFilter
- 初识Socket——Socket总结(一)