Uva 11235 (RMQ)
2014-09-25 15:57
330 查看
两个代码都是WA
RMQ:
线段树:
RMQ:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 100009 #define INF -0x7f7f7f int a[MAX],num[MAX],value[MAX],Count[MAX],left[MAX],right[MAX]; int dp[100009][100]; void RMQ_init(int cnt){ for(int i=0;i<cnt;i++){ dp[i][0]=Count[i]; } for(int i=1;(1<<i)<=cnt;i++){ for(int j=0;j+(1<<i)-1<cnt;j++){ dp[j][i]=max(dp[j][i-1],dp[j+(1<<(i-1))][i-1]); } } } int RMQ(int L,int R){ int k=0; while((1<<(k+1))<=(R-L+1)) k++; return max(dp[L][k],dp[R-(1<<k)+1][k]); } int main(){ int n,q; while(~scanf("%d",&n),n){ scanf("%d",&q); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } memset(Count,0,sizeof(Count)); memset(value,0,sizeof(value)); int cnt=0; value[cnt]=a[0]; Count[cnt]=1; left[cnt]=0; num[0]=cnt; for(int i=1;i<n;i++){ if(a[i]==value[cnt]){ Count[cnt]++; num[i]=cnt; }else{ right[cnt]=i-1; value[++cnt]=a[i]; left[cnt]=i; num[i]=cnt; Count[cnt]++; } } right[cnt]=n-1; RMQ_init(cnt+1); int L,R,ans,s,e; for(int i=0;i<q;i++){ scanf("%d %d",&s,&e); ans=INF; L=num[s-1]; R=num[e-1]; int tmp=right[L]-(s-1)+1; ans=tmp; if(L+1<=R-1)tmp=RMQ(L+1,R-1); if(ans<tmp) ans=tmp; tmp=(e-1)-left[R]+1; if(ans<tmp) ans=tmp; printf("%d\n",ans); } } return 0; }
线段树:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAX 100009 #define INF -0xffffff0 int a[MAX],num[MAX],value[MAX],Count[MAX],left[MAX],right[MAX]; int maxV; struct Node{ int maxV; int L; int R; int mid(){ return (L+R)/2; } }tree[MAX*4]; void build(int root, int s,int e){ tree[root].L=s; tree[root].R=e; tree[root].maxV=-INF; if(tree[root].L!=tree[root].R){ build(root*2,s,tree[root].mid()); build(root*2+1,tree[root].mid()+1,e); } } void insert(int root, int pos, int val){ if(tree[root].L==tree[root].R){ tree[root].maxV=val; return; } tree[root].maxV=max(tree[root].maxV,val); if(pos<=tree[root].mid()){ insert(root*2, pos, val); }else{ insert(root*2+1,pos,val); } } void query(int root, int s, int e){ if(tree[root].L==s&&tree[root].R==e){ maxV=max(tree[root].maxV,maxV); return ; } if(e<=tree[root].mid()){ query(root*2,s,e); }else if(s>tree[root].mid()){ query(root*2+1,s,e); }else{ query(root*2,s,tree[root].mid()); query(root*2+1,tree[root].mid()+1,e); } } int main(){ int n,q; while(~scanf("%d",&n),n){ scanf("%d",&q); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } memset(Count,0,sizeof(Count)); memset(value,0,sizeof(value)); int cnt=0; value[cnt]=a[0]; Count[cnt]=1; left[cnt]=0; num[0]=cnt; for(int i=1;i<n;i++){ if(a[i]==value[cnt]){ Count[cnt]++; num[i]=cnt; }else{ right[cnt]=i-1; value[++cnt]=a[i]; left[cnt]=i; num[i]=cnt; Count[cnt]++; } } right[cnt]=n-1; build(1,0,cnt); for(int i=0;i<=cnt;i++){ insert(1,i,Count[i]); } int L,R,ans,s,e; for(int i=0;i<q;i++){ scanf("%d %d",&s,&e); if(s>e) swap(e,s); s--; e--; L=num[s]; R=num[e]; ans=max(right[L]-s+1,e-left[R]+1); L++; R--; if(L<=R){ maxV=INF; query(1,L,R); ans=max(ans,maxV); } printf("%d\n",ans); } } return 0; }
相关文章推荐
- UVa 11235 Frequent values / RMQ or 线段树
- UVA 11235 Frequent values(RMQ)
- Uva 11235 频繁出现的数值(RMQ-Sparse Table 算法)(训练指南)
- UVA 11235 Frequent Values ---RMQ
- UVa 11235 Frequent values (RMQ)
- UVa - 11235 - Frequent values(RMQ)
- UVa 11235 RMQ
- Frequent Values(UVa 11235) RMQ问题
- uva11235 RMQ
- uva 11235 - Frequent values(RMQ)
- UVa 11235 FrequentValues(RMQ)
- UVA 11235 - Frequent values (RMQ的基础应用)
- UVa 11235 频繁出现的数值(RMQ)
- uva 11235 - Frequent values(RMQ)
- uva 11235 Frequent values RMQ
- UVA 11235 经典RMQ问题
- Uva 11235 Frequent values 【RMQ问题】
- UVA 11235 RMQ问题
- UVa 11235 RMQ好题
- UVa 11235 / POJ 3368 Frequent values (想法题&RMQ线段树维护最长区间长度)