Məni Yuxudan Oyan#12315

Məni Yuxudan Oyan (Həll təhlili)

Problem Müəllifi:

Hasan Saleh (MathModel)

Hazırlayan:

Hasan Saleh (MathModel)

Redaktə edən:

Hasan Saleh (MathModel)

Həll

-ni \{1,2,\dots,n\} dəstinin bir permutasiya olaraq götürək. Şərt

\forall i\in[1,n-k+1]\quad \Big(\sum_{j=0}^{k-1} p_{i+j}\Big)\bmod 2 = 1

yalnız elementlərin cütlüyündən asılıdır, çünki cüt ədədlər -yə modulu verir və tək ədədlər verir.

Uzunluğu olan ikili bir massiv təyin edin:

s_i = p_i \bmod 2 \in \{0,1\}.

Onda şərt belə olur:

\forall i\in[1,n-k+1]\quad \sum_{j=0}^{k-1} s_{i+j} \equiv 1 \pmod 2.

Beləliklə, -nin hər uzunluğu olan pəncərəsində tək sayda olmalıdır.

Əsas xüsusiyyət: dövriyyət

Tutaq ki,

S_i=\sum_{j=0}^{k-1}s_{i+j}\pmod 2.

Biz S_i=1 olmasını istəyirik, bütün etibarlı üçün. Ardıcıllıq pəncərələrini müqayisə edək:

S_{i+1} \equiv S_i - s_i + s_{i+k}\pmod 2.

Çünki S_i=S_{i+1}=1, biz alırıq

-s_i+s_{i+k}\equiv 0 \pmod 2 \;\Rightarrow\; s_{i+k}=s_i.

Beləliklə, -dövridir. Buna görə də, tam olaraq uzunluğu olan bir naxış ilə müəyyən edilir:

b_0,b_1,\dots,b_{k-1},\quad s_i=b_{(i-1)\bmod k}.

Tutaq ki, t=\sum_{j=0}^{k-1} b_j bir dövr içində -lərin sayıdır. Hər uzunluğu olan pəncərənin cəmi tam olaraq -dir, buna görə də şərt yalnız:

Tək sayıların uyğunluğu

Permutasiya içində tək dəyərlərin sayı sabitdir:

O=\#\{1\le x\le n: x \text{ tək}\}=\Big\lceil\frac{n}{2}\Big\rceil=\frac{n+1}{2}.

Beləliklə, -ni tam olaraq ədəd ilə qurmalıyıq.

n=qk+r yazın, burada 0\le r<k. -dövrü olan string aşağıdakılardan ibarətdir:

  • q\cdot t ədəd tam dövründən,

  • üstəlik ədəd naxışın ilk mövqesindən, burada x=\sum_{j=0}^{r-1} b_j.

Beləliklə, bizə lazım olan:

q\cdot t + x = O.

Verilmiş üçün, x=O-q\cdot t olur. İndi yalnız -in ilk mövqedə tam olaraq ədəd olan bir naxışın olub-olmadığını yoxlamaq lazımdır.

Mümkün aralıq üçün

Biz mövqedən ədəd seçirik; ilk mövqelər prefiksdir.

  • Prefiksdə maksimum sayı: \min(r,t).

  • Prefiksdə minimum sayı: əgər mümkün qədər çox -i prefikdən kənarda yerləşdirsək (oradakı k-r mövqelər var), onda ən azı t-(k-r) ədəd prefikdə olmalıdır, beləliklə:

    \max(0,\,t-(k-r)).

Beləliklə, verilmiş tək üçün, mümkünlük:

\max(0,\,t-(k-r)) \le x \le \min(r,t).

Biz -ni 1,3,5,\dots,k tək ədədlərdən sınayırıq və ilk mümkün olanı götürürük. Əgər heç biri işləmir, cavab -dir.

Naxış -ni qurmaq

seçdikdən sonra:

  • Prefiks mövqelərində 0,1,\dots,x-1 ədəd yerləşdirin (beləliklə prefiks tam olaraq ədəd -ə malikdir).

  • Qalan t-x ədəd prefiksdən kənarda yerləşdirilməlidir (indeks r,\dots,k-1) prefiks sayını dəyişməmək üçün.

Permutasiya qurmaq

İki siyahı hazırlayın:

  • artan sırada bütün tək ədədlər,

  • artan sırada bütün cüt ədədlər.

İndeks i=0..n-1 üçün:

  • əgər b[i\bmod k]=1 isə, növbəti tək ədədi yerləşdirin,

  • əks halda növbəti cüt ədədi yerləşdirin.

Bu, bir permutasiya yaradır (hər ədəd bir dəfə istifadə olunur) və quruluşuna görə cütlük naxışı -dövridir, beləliklə, hər uzunluğu olan pəncərə cəmi təkdir.

Komplekslik

Hər test üçün, biz dəyərini addım ilə sınayırıq, yəni , və permutasiyanı -də qururuq. Verilmiş \sum n\le 10^6, ümumi vaxt xətti olur.

İstinad kodu (Python)

for _ in range(int(input())):
    n,k=map(int,input().split())
    O=(n+1)//2
    q,r=divmod(n,k)

    t=x=-1
    for T in range(1,k+1,2):
        X=O-q*T
        if X<0: continue
        if max(0,T-(k-r))<=X<=min(r,T):
            t,x=T,X
            break
    if t<0:
        print(-1)
        continue

    b=[0]*k
    for i in range(x): b[i]=1
    y=t-x
    for i in range(r,k):
        if y==0: break
        b[i]=1; y-=1

    odds=list(range(1,n+1,2))
    evens=list(range(2,n+1,2))
    oi=ei=0
    ans=[]
    for i in range(n):
        if b[i%k]:
            ans.append(odds[oi]); oi+=1
        else:
            ans.append(evens[ei]); ei+=1
    print(*ans)