牛半仙的妹子序列

2021-10-10 03:30:53 字數 3230 閱讀 6146

傳送門 to nowcoder

不妨把題目中的 「魅力值」 叫做 ⟨a⟩

\langle a\rangle

⟨a⟩ 。

用 d

p\tt dp

dp,轉移條件比較苛刻。如果 f(j

)f(j)

f(j)

能轉移到 f(i

)f(i)

f(i)

,需要滿足:只關注不超過a

ia_i

ai​的數時,aj(

aj

)a_j(a_jaj

​(aj

​​)是 [j,

i)

[j,i)

[j,i

) 中最大的。

這個條件一看就是 cdq

\tt cdq

cdq 分治。只要看到 「只關注某值在某區間內」 的條件,往往都是如此。不妨看看御神渡,其轉移條件是 a

aa 值不相同,等價於乙個字首、乙個字尾,也是 cdq

\tt cdq

cdq 分治。

這個東西用 cdq

\tt cdq

cdq 的好處就是,計算交叉貢獻時,左邊的整個區間都是可以考慮的。

此時肯定是按照 a

aa 作為區間劃分依據。怎麼算交叉的貢獻呢?同樣的,與 御神渡 中求凸包沒啥區別。只看 [l,

m]

[l,m]

[l,m

] 中的 a

aa ,求出每個值右邊第乙個比自己大的,稱其下標為 r

jr_j

rj​ ;只看 (m,

r]

(m,r]

(m,r

] 中的 a

aa ,求出每個值左邊第乙個比自己小的,稱其下標為 l

il_i

li​ 。那麼轉移的充要條件變成(注意 i,j

i,ji,

j 是下標哦):

l i≤

j≤i≤

rj

l_i\le j\le i\le r_j

li​≤j≤

i≤rj

​ 這裡肯定不會有相等的情況,所以也可以寫成嚴格不等號。這玩意兒就比較好處理了,按照 l

il_i

li​ 排序後,每次加入所有 li≤

jl_i\le j

li​≤

j ,樹狀陣列實現 [j,

rj

][j,r_j]

[j,rj​

] 的區間加。複雜度 o(n

log⁡2n

)\mathcal o(n\log^2n)

o(nlog2n

) 。

#include

#include

#include

#include

using

namespace std;

typedef

long

long int_;

inline

intreadint()

const

int maxn =

200010

;const

int infty =(1

<<30)

-1;const

int mod =

998244353

;int n;

// though alone, still necessary

struct node

bool

operator

<

(const node &t)

const};

node node[maxn]

;class

bitint

query

(int x)

void

clear

(int x)};

bit xyx;

vector<

int> sta;

void

getinfo

(int l,

int r)

sta.

clear()

;// essential

sta.

push_back

(n+1);

// be bottom

for(

int i=r; i>=l;

--i)

}bool

cmp(

const node &x,

const node &y)

bool

cdq(

const node &x,

const node &y)

void

solve

(int l,

int r)

node[i]

.dp +

= xyx.

query

(node[i]

.id)

; node[i]

.dp %

= mod;

// 小心點!

}for

(int i=l; i<=m;

++i)

sort

(node+m+

1,node+r+

1,cdq)

;solve

(m+1

,r);

// 繼續遞迴右邊

}int

main()

} node[0]

.id = node[0]

.a =0;

node[n+1]

.id = node[n+1]

.a = n+1;

sort

(node+

1,node+n+

1,cdq)

;solve(1

,n);

// 兩個邊界都是實點

sort

(node+

1,node+n+1)

;// 還原成原序列!

int ans =0;

// sy orz. xyx orz.

for(

int i=n,now=

0; i;

--i)

if(node[i]

.a > now)

printf

("%d\n"

,ans)

;return0;

}

牛半仙的妹子序列

牛半仙有 n 個妹子,魅力值分別為 1 n,排成一排。牛半仙會在這些妹子中選若干個,但是他很 貪婪,他只會選完美妹子序列。乙個妹子序列 p ip i pi 指妹子的位置 是完美的,當且僅當其是一 個上公升序列,且不存在乙個 j,使得j pm j p m j pm 且 v j vp mv j v vj...

牛半仙的妹子串

operatorname nowcod er21 2921 點我可以檢視其它題目 目錄 點我跳轉 題目描述 牛半仙有 n n n 個妹子。牛半仙用對於每個妹子都有乙個名字,並且給了每個妹子乙個評分。牛半仙的審美與名字有關,他想知道名字以某字母結尾的妹子中,評分第 k k k 大的妹子的名字。如果出現...

nowcoder 2020 牛半仙的妹子數

點此看題 考試時候先打了個表,首先我們可以確定a b ca b c a b c是乙個定值,一開始我想去維護a aa和b bb然後去算c cc,但是這樣會很難算,a aa和b bb的變化是極不規律的,我們不妨去研究ccc 在重複一遍,p a b c p a b c p a b c是定值,打表如下 資料...