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 從組合意義上不難理解...