LUOGU P4587 [FJOI2016]神秘数(主席树)
生活随笔
收集整理的這篇文章主要介紹了
LUOGU P4587 [FJOI2016]神秘数(主席树)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門(mén)
解題思路
如果區(qū)間內(nèi)沒(méi)有\(1\),那么答案就為\(1\),從這一點(diǎn)繼續(xù)歸納。如果區(qū)間內(nèi)有\(x\)個(gè)\(1\),設(shè)區(qū)間內(nèi)\([2,x+1]\)的和為\(sum\),如果\(sum=0\),那么答案為\(x+1\),否則\([1,x+sum]\)中的所有數(shù)字一定可以被表示,然后這個(gè)操作每次使答案至少擴(kuò)大\(1\)倍,再用一個(gè)主席樹(shù)維護(hù),時(shí)間復(fù)雜度\(O(nlognlogA)\)
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm>using namespace std; const int N=100005; const int M=N*33; const int inf=1000000000; typedef long long LL;template<class T> void rd(T &x){x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); } int n,m,a[N],rt[N],ls[M],rs[M],sum[M],cnt; LL Sum[M];void build(int &x,int l,int r,int k){x=++cnt;if(l==r) {sum[x]=1;Sum[x]=l;return ;}int mid=(l+r)>>1;if(k<=mid) build(ls[x],l,mid,k);else build(rs[x],mid+1,r,k);Sum[x]=Sum[ls[x]]+Sum[rs[x]]; }void update(int pre,int &x,int l,int r,int k){x=++cnt;ls[x]=ls[pre];rs[x]=rs[pre];if(l==r) {sum[x]=sum[pre]+1;Sum[x]=Sum[pre]+l;return;}int mid=(l+r)>>1;if(k<=mid) update(ls[pre],ls[x],l,mid,k);else update(rs[pre],rs[x],mid+1,r,k);Sum[x]=Sum[ls[x]]+Sum[rs[x]]; }int query_tot(int u,int v,int l,int r,int k){if(l==r) return sum[v]-sum[u];int mid=(l+r)>>1;if(k<=mid) return query_tot(ls[u],ls[v],l,mid,k);else return query_tot(rs[u],rs[v],mid+1,r,k); }LL query_sum(int u,int v,int l,int r,int L,int R){if(L<=l && r<=R) return Sum[v]-Sum[u];int mid=(l+r)>>1;LL ret=0;if(L<=mid) ret+=query_sum(ls[u],ls[v],l,mid,L,R);if(mid<R) ret+=query_sum(rs[u],rs[v],mid+1,r,L,R);return ret; }int main(){rd(n);rd(a[1]);build(rt[1],1,inf,a[1]);for(int i=2;i<=n;i++)rd(a[i]),update(rt[i-1],rt[i],1,inf,a[i]);rd(m);int l,r,now,k,tot,lst;while(m--){rd(l),rd(r);k=0;lst=0;while(1){now=query_sum(rt[l-1],rt[r],1,inf,lst,k+1);if(!now) break;lst=k+2;k=now+k;}printf("%d\n",k+1);}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/sdfzsyq/p/10254219.html
總結(jié)
以上是生活随笔為你收集整理的LUOGU P4587 [FJOI2016]神秘数(主席树)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 抽象工厂模式(JAVA反射)
- 下一篇: 【LeetCode】103# 二叉树的锯