三個陣列,每個都是1到n的排列, 定義為good pair,當且僅當,在三個陣列中,i和j的相對關係一樣。給出三個陣列,求good pair的數目。
sample input
sample output
42 3 1 4
2 1 4 3
2 4 3 1
3先考慮兩兩陣列,可以通過以一組為基準(rank,相對大小),求解另一組的逆序對數目,即not good pair的數目。
那三個陣列呢?考慮n=2,只有四種情況:
12 12 12
21 21 21
12 12 21
21 21 12
所以可以對三個陣列兩兩求解逆序對,最後計算good pair數目。
一組和為x
xx的正整數集合稱為x
xx的乙個分割,形如x=a
1+a2
+...
+a
nx = a_1 + a_2 + ... + a_n
x=a1+
a2+
...+
an的分割滿足以下條件時,稱作神奇的分割。
ai−令f(x1≤ai
≤ai−
1+
1a_\leq a_ \leq a_+1
ai−1≤
ai≤
ai−1
+1an=
a1+2
a_n = a_1 + 2
an=a1
+2
)f(x)
f(x)
表示n的神奇分割的種類數,詢問給出l,r
l,rl,
r,求f(l
)+f(
l+1)
+...
+f(r
)f(l) + f(l + 1) + ... + f(r)
f(l)+f
(l+1
)+..
.+f(
r)重點:找規律+二次差分
區間更新 - > 差分
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
400000+10
;ll tow[maxn]
, one[maxn]
, ans[maxn]
;void
init()
//計算一次差分陣列
for(
int i =
2; i <= n;
++i)tow[i]
+= tow[i -2]
;for
(int i =
1; i <= n;
++i)one[i]
+= one[i -1]
;//合併一次差分陣列
for(
int i =
1; i <= n;
++i)ans[i]
= tow[i]
+ one[i]
;//計算f(x)
for(
int i =
1; i <= n;
++i)ans[i]
+= ans[i -1]
;//計算f(x)的字首和
for(
int i =
1; i <= n;
++i)ans[i]
+= ans[i -1]
;}intmain()
system
("pause");
return0;
}
戰爭 思維題
內部題不放了 樣例輸入2 512 34 45 5105 10 15 43 20 5樣例輸出possible 4 100 impossibleps 感謝yxy給我講明白了這道題 太久沒水題解了來水乙個 早知道這篇題解這麼難寫就不寫了 include include include include de...
面試 思維開發題
1.你讓工人為你工作7天,給工人的回報是一根金條。金條平分成相連的7段,你必須在每天結束時給他們一段金條,如果只許你兩次把金條弄斷,你如何給你的工人付費?答案 將金塊弄斷兩次,折成1比2比4三段。付費情況如下 第x天付費 找回剩餘多少 第一天1 02 4 第二天2 14 1 第三天104 第四天4 ...
E Magic Stones (思維好題)
題意 給出a陣列,b陣列,下標為2 n 1 可以進行操作,a i a i 1 a i 1 a i 問進行若干次操作,能否將a陣列變成b陣列 思路 真是一道很巧妙的題目。對三個數字a i 1 a i a i 1,d1 a i a i 1 d2 a i 1 a i a i 可以這樣看,a i a i 1...