P5367 [[템플릿] 칸토어 확장 문제에 대한 해결 방법

P5367 [템플릿] 선창자는 확장

이 질문은 아마도, 녹색 및 청색 제목 사이에 qwq 더 어려운 문제라고 생각

첫째, 칸토어에 로스 밸리 데일리 [맛있는]를 확장

나는 321 {1,2,3}을 알고 싶다면이 고려 여러 개의 작은 번호의 첫 번째입니다 :

첫 번째 숫자는 다음의 순열의 수가 3보다 작은 경우 (3), 제 321 미만 같은 123, 213, 수는 1보다 2 ~ 3이다. 그래서 두가 2! 달은. 제 2 미만 보면 : 수가 2 미만 만 1이고, 그 1 ! 1 = 1 따라서, 이하 321 {1,2,3}의 순열의 수는 2 보유 + 1 2을 1 = 5! 그래서 321은 6 개 개의 작은 번호의 처음이다. 2 2! + 1 1! + 0 * 0! 칸토어 확장된다.

다른 예 : 1324 처음 몇 다수 순열 {1,2,3,4}의 수이다 : 상기 제 1 개수보다 작지 1이고, 0 0 3 3 초 이하 3! 이 숫자 1, 2, 그러나 1은 첫 번째 장소에 있었다, 그래서 하나의 번호 2 1이 2가! 세 번째 숫자는 숫자 0 0 2는 처음에 1 미만이 1이지만 인 1 !, 그래서 미만 1,324 0이 배치된다 . 3,2 + 1 2! +0 1! = 2, 1324 제 진수이다. (바이두에서 발췌)

폭력 행위

//n表示全排列长度
for(int i=1;i<=n;i++)
{
    cin>>a[i];
    int x=a[i];
    for(int j=1;j<=a[i];j++)
        x-=used[j];
    //used[j]表示j是否用过(1用过,0没用)
    used[a[i]]=1;
    a[i]=x-1;
}

둘째, 최적화

"우리는 방법을보고있는 것은이주기를 가지고, 시간 복잡도가 O (^ 2 N) 인, 왼쪽의 수는 사용 시간이 많이 소요의 수를 찾을 수 있습니다.

로서 기능 범위 길고 유지 보수 세그먼트 트리 또는 트리의 배열을 사용, 당신은 단지 왼쪽은 자신의 수의 수보다 찾기 위해 시간을 보낼 로그인 할 수 있습니다. "(매일에서 발췌)

셋째, 코드

#include<cstdio>
using namespace std;
#define N 1000001
int n,tr[N];
long long ans,fac[N];
inline void add(int x,int k) {
    for (; x<=n; x+=x&-x) tr[x]+=k;
}
inline int query(int x) {
    int t=0;
    for (; x; x-=x&-x) t+=tr[x];
    return t;
}
int main() {
    scanf("%d",&n);
    fac[0]=1;
    for (int i=1; i<=n; i++) {
        fac[i]=fac[i-1]*i%998244353;
        add(i,1);
    }
    for (int i=1,x; i<=n; i++) {
        scanf("%d",&x);
        ans=(ans+(query(x)-1)*fac[n-i])%998244353;
        add(x,-1);
    }
    printf("%lld",ans+1);
    return 0;
}

넷째, 확장 : 역 캔터를 확장

예 {1,2,3,4,5} 전체 배열하고, 오름차순으로 정렬 된

(1) (96)의 수를 식별하는

먼저 95 96-1로

4 95 제거! 이상의 323 받기

이 네 개의보다 작은 세 개의 숫자가 있습니다

그래서 첫 번째 4

23 세의 제거와 함께! 35 개 이상의 받기

세 개의 숫자가 4보다 작을 수 있지만, 제 5 이렇게되기 전에 4 나타났다 (4 이전에 발생한, 실제 번호 5는 3보다 작다)

(5) (2)를 제거합니다! 얻기 2 개 이상 (1)

거기는 숫자 2가 3 번, 3 번째보다 작은

(1) (1)를 제거함으로써! 10 개 이상의 받기

2는 두 번째, 2 수보다 작은 수 있습니다

마지막 숫자는 1입니다

그래서이 숫자는 45,321 (바이두에서 촬영)입니다

추천

출처www.cnblogs.com/Randolph68706/p/11200202.html