【CF1017C】The Phone Number(构造)

题意:要求构造一个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 }
原文地址:https://www.cnblogs.com/myx12345/p/9843078.html