樹狀陣列 + 二分
這裡先給出乙個公式 第 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 有乙個奇怪的國家,裡面的國民對於事情的態度永遠只有兩面。當兩個人遇到一起討論乙個事情的時候 兩個持贊同觀點的人遇到一起後會對這個事情都繼續贊同 乙個持贊同觀點的人遇到乙個持不贊同觀點的人的時候,兩人都會不再繼續贊同 兩個持不贊同觀點的人遇...