bzoj3585(线段树)

来源:互联网 发布:海马电动车数据 编辑:程序博客网 时间:2024/05/18 21:08

细节好恶心

其实这题是一个莫队的裸题,莫队不难搞。

线段树处理离线这个地方有点麻烦

#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<cstdio>using namespace std;const int N=200005;const int inf=0x3f3f3f3f;inline int read(){int ans,f=1;char ch;while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';return ans*f;}int ans[N];struct aa{int l,r,id;bool operator <(const aa &b) const //Á½¸öconst¶¼ÒªÓÐ {return l<b.l;} }q[N];int n,m;int a[N],b[N],sg[N],c[N];int head[N],next[N];struct aaa{int l,r,mi;}t[N*5];void build(int i,int l,int r){t[i].l=l;t[i].r=r;t[i].mi=inf;if  (l==r){t[i].mi=sg[l];return ;}int mid=(l+r)>>1;build(i<<1,l,mid);build(i<<1|1,mid+1,r);}void down(int i){if (t[i].mi!=inf){t[i<<1].mi=min(t[i<<1].mi,t[i].mi);t[i<<1|1].mi=min(t[i<<1|1].mi,t[i].mi);t[i].mi=inf;}}void updata(int i,int l,int r,int k){if (t[i].l==l&&t[i].r==r) {t[i].mi=min(t[i].mi,k);return ;}down(i);int mid=(t[i].l+t[i].r)>>1;if (r<=mid) updata(i<<1,l,r,k);else if (l>mid) updata(i<<1|1,l,r,k);else updata(i<<1,l,mid,k),updata(i<<1|1,mid+1,r,k);}int ask(int i,int x){if (t[i].l==t[i].r) return t[i].mi;down(i);int mid=(t[i].l+t[i].r)>>1;if (x<=mid) return ask(i<<1,x);else return ask(i<<1|1,x);}int main(){n=read(),m=read();for (int i=1;i<=n;i++) a[i]=b[i]=read();sort(b+1,b+n+1);int nn=unique(b+1,b+n+1)-b-1;for (int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;sort(q+1,q+m+1);int k=0;for (int i=1;i<=n;i++){int t=lower_bound(b+1,b+nn+1,a[i])-b;c[t]=1;if (a[i]==k)while (c[t]) {k++;if (b[++t]!=k) break;}sg[i]=k;t=lower_bound(b+1,b+nn+1,a[i])-b;next[head[t]]=i;head[t]=i;}build(1,1,n);int now=1;for (int i=1;i<=n;i++){while (now<q[i].l){if (next[now]==0) next[now]=n+1;updata(1,now,next[now]-1,a[now]);now++;}ans[q[i].id]=ask(1,q[i].r);}for (int i=1;i<=m;i++) printf("%d\n",ans[i]);return 0;} 


 

0 0
原创粉丝点击