BZOJ3152 組合子邏輯,貪心 堆

2021-07-09 20:10:34 字數 2098 閱讀 8194

3152: [ctsc2013]組合子邏輯

time limit: 10 sec memory limit: 128 mb

submit: 176 solved: 107

[submit][status][discuss]

description

組合子邏輯是moses schönfinkel和haskell curry發明的一種符號系統,用於消除數理邏輯中對於變數的需要。本題考察一種與真實世界的組合子演算略有差別的組合子系統。 乙個組合子項是下列形式之一:

p (e1 e2)

其中p表示乙個基本函式,e1以及e2表示乙個組合子項(可以相同)。不滿足以上形式的表示式均非組合子項。

我們將乙個組合子項e的引數個數np(e)如下:

np(p) = 基本函式p的引數個數;

np((e1 e2)) = np(e1) - 1。

本題中,我們用乙個正整數同時表示乙個基本函式,以及該基本函式的引數個數。 對於乙個組合子項e,如果它和它包含的所有組合子項的引數個數np均為正整數,那麼我們稱這個e為正規化。

我們經常組合子項簡化表示:如果乙個組合子項e含有連續子串行(… ((e1 e2) e3) … en) (其中n ≥ 3),其中ek表示組合子項(可以是簡化表示的),那麼將該部分替換為(e1 e2 e3 … en),其他部分不變,得到表示式e的乙個簡化表示。乙個組合子項可以被簡化表示多次。 給定乙個基本函式序列,問至少需要新增多少對括號,才能使得該表示式成為乙個正規化的簡化表示(即滿足正規化的性質);如果無論如何怎樣新增括號,均不能得到正規化的簡化表示,輸出-1。

input

第一行包含乙個正整數t,表示有t次詢問。 接下來2t行。 第2k行有乙個正整數nk,表示第k次詢問的序列中基本函式的個數。 第2k + 1行有nk個正整數,其中第i個整數表示序列中第i個基本函式。

output

輸出t行,每行乙個整數,表示對應詢問的輸出結果。

sample input

2 5

3 2 1 3 2

5 1 1 1 1 1

sample output

3 -1

hint

【樣例說明】

第一次詢問:乙個最優方案是(3 (2 1) (3 2))。可以證明不存在新增括號對數更少的方案。

第二次詢問:容易證明不存在合法方案。

令tn表示輸入中所有nk的和。tn≤2000000

寫在前面:怎麼感覺最近不在狀態了?又到了退役的季節?

思路:讀題讀了半個小時才明白題意= =

主要是把原序列a逐漸縮點最終形成乙個不上公升序列,從頭開始往下划拉(初值k為a[1]),如果到第i個點時k>1(即可以拓展)就k–,如果k=1那麼一定要在已經拓展的點x中再拓展出乙個子串行(且易知這個子串行一定能被k拓展),這樣k=k+x-1(因為k可以不必乙個個擴充套件這個子串行中的點,而是直接擴充套件整個子串行,消耗的價值由子串行的長度len減為1,而len就等於這個序列中最大的點,即最左邊的點的權值-1,就是大於1的點可以幫助拓展),同時ans++。因此我們知道肯定先用之前讀過的最大的點(max)來擴充套件肯定是最優的且能擴充套件的序列max長度一定是它的權值-1,所以加乙個堆來存放之前讀進來的a[i]就可以了,當(空堆||最大值為1)&&k<=1時,輸出-1。

還有一點就是n=1時要注意,如果讀入的數不用括號就可以(輸出0)

#include

#include

#include

#include

#include

using

namespace

std;

int t,n,a[2000010];

int in()

void solve()

priority_queue team;

for (int i=1;i<=n;i++) a[i]=in();

int k=a[1];

for (int i=2;i<=n;i++)

else ans++,k+=team.top()-1,team.pop();

k--;

team.push(a[i]);

}printf("%d\n",ans);

}main()

BZOJ3197 組合亂搞

description 求 sum i m m i m leq 1000 的值.solution from miskcoo s space 設 begin f i sum n k i cdot m k end 則我們要求 f m 所謂的 擾動法 begin m 1 f i m cdot sum k ...

BZOJ 3997 組合數學

bzoj 3997 傳送門 這題是乙個比較明顯的最小鏈覆蓋,只不過還給每條鏈加上了權值 dilworth 定理 最小鏈覆蓋數 最長反鏈長度 一般用 dilworth 定理都是求最長反鏈,這題算是逆運用吧 發現能構成反鏈的兩點一定是具有 左上 右下 的位置關係,於是我們從右上角 1,m 開始,dp 到...

bzoj 4870 組合數問題

目錄求 sum c mod p 原題傳送門。這不是單位根反演裸題嗎 注意到模數並沒有特殊性質,可以想到從組合數的遞推公式入手。當 k 1 實際上就是快速冪,所以聯想到說不定可以矩陣冪優化。記 f n r sum c 則 f n r sum c times f r j mod k 從組合意義上不難理解...