标签:
你可以选得子集从A1开始到A4,这个子集长度为4,包含了1,2,3,4)
1<=n<=100010
题解传送门:http://www.shuizilong.com/house/archives/spoj-744-longest-permutation/
#include<iostream> #include<cstdio> #include<cstring> #include<cstdio> using namespace std; #define MAXN 101000 typedef long long qword; int a[MAXN]; int prv[MAXN]; int pid[MAXN]; int vis[MAXN]; int l[MAXN]; qword s[MAXN]; int bstans=0; void solve(int n) { memset(pid,0,sizeof(pid)); for (int i=1;i<=n;i++) { if (a[i]>n) { prv[i]=0; a[i]=n+1; } else { prv[i]=pid[a[i]]; pid[a[i]]=i; } } for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; for (int i=1;i<=n;i++) { if (a[i]==1) { int mx=0; for (int j=i+1;j<=n && a[j]!=1;j++) l[j]=min(l[j-1],prv[j]); int prvmax=0; for (int j=i;j>=1 && (j==i || a[j]!=1);j--) { mx=max(mx,a[j]); prvmax=max(prvmax,prv[j]); if (j+mx-1<i || j+mx-1>n)continue; if (max(prvmax,l[j+mx-1])>=j)continue; if (s[j+mx-1]-s[j-1]==(qword)(mx+1)*mx/2) { bstans=max(bstans,mx); } } } } } int main() { freopen("input.txt","r",stdin); int n; scanf("%d",&n); int l,r; for (int i=1;i<=n;i++) scanf("%d",a+i); solve(n); for (int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]); solve(n); printf("%d\n",bstans); }
bzoj 1318: [Spoj744] Longest Permutation 智商题
标签:
原文地址:http://www.cnblogs.com/mhy12345/p/4569469.html