時間限制: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 操縱忍者時遇到這樣乙個場景,兩棟大樓之間有許多繩索,從側面看,就像這個樣子 我們的忍者非常有好奇心,他可以觀察到每個繩索的端點在兩棟樓的高度,想知道這些繩索有多少個交點 圖中黑色的點 他觀察到不會建築上不會有一點上有兩個繩索,並且沒有三條繩索共...