傳送門 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 log2n )\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是定值,打表如下 資料...