計蒜客 奇怪的報數遊戲

2021-09-05 11:00:24 字數 1429 閱讀 3703

樹狀陣列 + 二分

這裡先給出乙個公式 第 i 個數的編號= i 之前比 i 小的總數量+ i 之後比 i 小的總數量+1

例如 1 4 3 6 2 5 這個序列,我們可以用這個序列來驗證上述的公式,比如3 = 1 (3前邊只有1比3小,所以只有1個) + 1 (3後邊只有2比3小,所以只有1個) + 1,對吧。

已經找出來的編號我們可以存進樹狀陣列中,這樣我們就可以直接通過getsum(x)直接查詢比x小的數總共有多少個數。

我們從後往前推,最後乙個數可以直接推出來,它就等於前邊比他小的數+1(因為他後面沒有數就可以不用加了 笑哭臉.jpg)

倒數第二個數呢, ?(他的編號,還不知道,所有先用問號代替)=num[ n-1 ](他前面比他小的數,這個數題目給了的)+ ?(他後面比他小的數,同樣也是不知道)+1,雖然我們現在不知道他的編號是多少,但我們可以通過二分思想把他的編號找出來,可以看下下面**

l=

1;r=n+1;

while

(lchange

(r-1);

//找出編號,編號等於r-1

ans[i]

=r-1

; flag[r-1]

=true;

這樣就可以求出倒數第二個數,其實這個也可以求出倒數第一數,因為第乙個數前邊有多少數沒有給出來,所以這樣就可以一直求到第二個數,現在就只剩乙個數,很簡單的,我在這裡就不提示了(實在想不出來可以看看我的flag陣列)

#include

#include

const

int maxn=

1e5+1;

int ans[maxn]

,c[maxn]

,num[maxn]

,n;bool flag[maxn]

;int

getsum

(int x)

void

change

(int x)

intmain()

change

(r-1);

//找到數字,數字等於r-1

ans[i]

=r-1

; flag[r-1]

=true;

}for

(int i=

1;i<=n;i++)}

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,ans[i]);

return0;

//give me five

}

計蒜客 奇怪的國家

有乙個奇怪的國家,裡面的國民對於事情的態度永遠只有兩面。當兩個人遇到一起討論乙個事情的時候 兩個持贊同觀點的人遇到一起後會對這個事情都繼續贊同 乙個持贊同觀點的人遇到乙個持不贊同觀點的人的時候,兩人都會不再繼續贊同 兩個持不贊同觀點的人遇到一起討論後反而會對這個事情開始贊同。輸入包括兩行,每行包括 ...

計蒜客題目 奇怪的國家

有乙個奇怪的國家,裡面的國民對於事情的態度永遠只有兩面。當兩個人遇到一起討論乙個事情的時候 兩個持贊同觀點的人遇到一起後會對這個事情都繼續贊同 乙個持贊同觀點的人遇到乙個持不贊同觀點的人的時候,兩人都會不再繼續贊同 兩個持不贊同觀點的人遇到一起討論後反而會對這個事情開始贊同。輸入包括兩行,每行包括 ...

計蒜客 奇怪的國家 題解

time 1000ms memory 65536k desc 有乙個奇怪的國家,裡面的國民對於事情的態度永遠只有兩面。當兩個人遇到一起討論乙個事情的時候 兩個持贊同觀點的人遇到一起後會對這個事情都繼續贊同 乙個持贊同觀點的人遇到乙個持不贊同觀點的人的時候,兩人都會不再繼續贊同 兩個持不贊同觀點的人遇...