思維題合集

2021-10-08 16:39:32 字數 1891 閱讀 5455

三個陣列,每個都是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−

1≤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)

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...