出題人的手環(離散化樹狀陣列求逆序 思維)

2021-09-10 01:49:18 字數 1741 閱讀 1331

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 524288k,其他語言1048576k

64bit io format: %lld

出題人的妹子送了出題人乙個手環,這個手環上有 n 個珠子,每個珠子上有乙個數。

有一天,出題人和妹子分手了,想把這個手環從兩個珠子間切開,並按順時針順序展開成一條鏈。

可以發現,這條鏈一共有 n 種可能性。求這 n 種可能性的逆序對數之積模 1000000007。

第一行乙個數 n,表示珠子個數。

接下來一行 n 個數,以順時針順序給出每個珠子上的整數

乙個數,表示答案。
示例1

複製

4

1 3 2 3

複製

24
一共有 4 種方式:

1 3 2 3;3 1 3 2;2 3 1 3;3 2 3 1;

逆序對數分別為 1,3,2,4,積為 24。

n<=200000,-10^9<=珠子上的整數<=10^9。
這道題我覺得還挺好的。

賽時愣是沒想出來。知道是樹狀陣列離散化逆序,但是每乙個都往後移動我就不知道怎麼算了,想了半天無果。

後來發現自己簡直傻了。。。

舉個例子:

假如是      2 3 1 4   的逆序數是ans

那麼      3 1 4 2  的逆序數就是原來的不動,加上2~n裡面的比2大的數的個數,減掉2~n裡面比2小的個數

1 4 2 3   的逆序數就是原來的不動,加上2~n裡面的比1大的數的個數,減掉2~n裡面比1小的個數

好了,傻傻的我糾結於怎麼求了。。因為每一次2~n都是變化的。

but!!看起來是這樣,實際上就是除了他自己以外大於他的和小於他的啊~

然後濾清思路之後又敲了一發,只過了百分之50的樣例。

仔細看了看mod。。。sum=(sum+mod)%mod;這個地方。嗯,因為之前減掉了乙個數,所以為了防止變成負數。。之前還專門注意了一下。

欸,有點菜~

**:

#includeusing namespace std;

const int mod=1000000007;

typedef long long ll;

const int maxn=200000+100;

const ll inf=200000+100;///離散化之後最大就是n的個數

ll a[maxn],c[maxn],he[maxn];

struct nodelala[maxn];

int cmp(node a,node b)

return summ;

}int main()

sort(lala+1,lala+1+n,cmp);

/// lala[1].neww=1;

/// he[1]=1;

for(int i=1;i<=n;i++)

else

he[lala[i].neww]=i;

}sort(lala+1,lala+1+n,cmp2);///按照原始順序排

ll sum=0;

for(int i=1;i<=n;i++)

ll ans=sum%mod;

for(int i=1;iprintf("%lld\n",ans);

}}

樹狀陣列 (離散化 樹狀陣列 求逆序對)

sample test s input 52 3 1 5 4 output 3 題目大意 求逆序對的個數 題目分析 求逆序對有很多方法,比如說用合併排序 分治 樹狀陣列 線段樹,甚至連暴力 氣泡排序 也可以做,但是要注意會不會超時。這裡就講一下樹狀陣列的方法,這一題最有意思的是離散化的方法,這個方法...

樹狀陣列求逆序對及離散化

樹狀陣列求逆序對及離散化 逆序對指的是乙個序列中有兩個數ai和aj,iaj,即它們下標與數值的增減不一致,那麼對於這個問題 求乙個序列中逆序對的個數,該如何解決呢?我最初接觸到的方法是歸併排序,是個很不錯的方法,但是對於向我一樣的蒟蒻 還是有理解難度,而今天講的樹狀陣列解法,至少 理解難度降低了不少...

求逆序數數目(樹狀陣列 離散化)

404在玩忍者印記 mark of the ninja 操縱忍者時遇到這樣乙個場景,兩棟大樓之間有許多繩索,從側面看,就像這個樣子 我們的忍者非常有好奇心,他可以觀察到每個繩索的端點在兩棟樓的高度,想知道這些繩索有多少個交點 圖中黑色的點 他觀察到不會建築上不會有一點上有兩個繩索,並且沒有三條繩索共...