题意:要求构造一个1-n的排列,使得它的LIS+LDS最小
n<=1e5
思路:一个百度之星时候从LYY处听来的结论:1-n随机排列的LIS期望是根号级别的
考虑将LIS与LDS都构造成根号级别
分块,块内增(减),块间减(增)
1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<vector> 11 using namespace std; 12 typedef long long ll; 13 typedef unsigned int uint; 14 typedef unsigned long long ull; 15 typedef pair<int,int> PII; 16 typedef vector<int> VI; 17 #define fi first 18 #define se second 19 #define MP make_pair 20 #define N 110000 21 #define MOD 1000000007 22 #define eps 1e-8 23 #define pi acos(-1) 24 25 int a[N]; 26 27 int read() 28 { 29 int v=0,f=1; 30 char c=getchar(); 31 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 32 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 33 return v*f; 34 } 35 36 void swap(int &x,int &y) 37 { 38 int t=x;x=y;y=t; 39 } 40 41 42 int main() 43 { 44 //freopen("1.in","r",stdin); 45 //freopen("1.out","w",stdout); 46 int n; 47 scanf("%d",&n); 48 int block=sqrt(n); 49 int m=n/block; 50 int now=n; 51 int s=0; 52 int st=n-block+1; 53 for(int i=1;i<=m;i++) 54 { 55 for(int j=1;j<=block;j++) a[++s]=st++; 56 st=st-2*block; 57 } 58 if(n%block) 59 { 60 st=1; 61 for(int i=1;i<=n%block;i++) a[++s]=st++; 62 } 63 64 for(int i=1;i<=n;i++) printf("%d ",a[i]); 65 return 0; 66 }