bzoj4199 Noi2015 品酒大會

2022-05-19 05:04:11 字數 3062 閱讀 6531

一年一度的「幻影閣夏日品酒大會」隆重開幕了。大會包含品嚐和趣味挑戰兩個環節,分別向優勝者頒發「首席品酒家」和「首席獵手」兩個獎項,吸引了眾多品酒師參加。

在大會的晚餐上,調酒師 rainbow 調製了 \(n\) 杯雞尾酒。這 \(n\) 杯雞尾酒排成一行,其中第 \(i\) 杯酒 \((1 \le i \le n)\) 被貼上了乙個標籤 \(s_i\),每個標籤都是 \(26\) 個小寫英文本母之一。設 \(str(i,j)\) 表示第 \(i\) 杯酒到第 \(j\) 杯酒的 \(j−i+1\) 個標籤順次連線構成的字串。若 \(str(l_1, r_1)=str(l_2, r_2)\),其中\(1 \le l_1 \le r_1 \le n, 1 \le l_2 \le r_2 \le n, l_1 \ne l_2, r_1 − l_1 + 1 = r_2 − l_2 + 1 = p\) ,則稱第 \(l_1\) 杯酒與第 \(l_2\) 杯酒是「 \(p\) 相似」的。當然兩杯「 \(p\) 相似」 \(( p>1)\) 的酒同時也是「 \(1\) 相似」、「\(2\) 相似」、……、「\((p−1)\) 相似」的。特別地,對於任意的 \(1 \le p, q \le n, p \ne q\),第 \(p\) 杯酒和第 \(q\) 杯酒都是「\(0\) 相似」的。

在品嚐環節上,品酒師 freda 輕鬆地評定了每一杯酒的美味度,憑藉其專業的水準和經驗成功奪取了「首席品酒家」的稱號,其中第 \(i\) 杯酒 \((1 \le i \le n)\) 的美味度為 \(a_i\) 。現在 rainbow 公布了挑戰環節的問題:本次大會調製的雞尾酒有乙個特點,如果把第 \(i\) 杯酒與第 \(j\) 杯酒調兌在一起,將得到一杯美味度為 \(a_i ∗ a_j\) 的酒。現在請各位品酒師分別對於 \(p = 0, 1, 2,..., p−1\) ,統計出有多少種方法可以選出 \(2\) 杯「 \(p\) 相似」的酒,並回答選擇 \(2\) 杯「 \(p\) 相似」的酒調兌可以得到的美味度的最大值。

輸入檔案的第 \(1\) 行包含 \(1\) 個正整數 \(n\) ,表示雞尾酒的杯數。

第 \(2\) 行包含乙個長度為 \(n\) 的字串 \(s\) ,其中第 \(i\) 個字元表示第 \(i\) 杯酒的標籤。

第 \(3\) 行包含 \(n\) 個整數,相鄰整數之間用單個空格隔開,其中第 \(i\) 個整數表示第 \(i\) 杯酒的美味度 \(a_i\) 。

\(n\le300000, |a_i |\le1000000000\)

輸出檔案包括 \(n\) 行。第 \(i\) 行輸出 \(2\) 個整數,中間用單個空格隔開。第 \(1\) 個整數表示選出兩杯「 \((i-1)\) 相似」的酒的方案數,第 \(2\) 個整數表示選出兩杯「$ (i-1)$ 相似」的酒調兌可以得到的最大美味度。若不存在兩杯「 \((i-1)\) 相似」的酒,這兩個數均為 \(0\) 。

10

ponoiiipoi

2 1 4 7 4 8 3 6 4 7

45 56

10 56

3 32

0 00 0

0 00 0

0 00 0

0 0

這暑假題要是沒做出來怕不是要被 lxs 關起來

第一問直接建出字尾陣列,用 \(height\) 算出每乙個點有貢獻的區間。

第二問就用個並查集搞一搞就好了

#includeusing namespace std;

#define n 300001

#define drp(i, a, b) for (int i = a; i >= b; i--)

#define rep(i, a, b) for (int i = a; i <= b; i++)

#define ll long long

inline int read()

while (isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar(); return x * flag;

}int n;

char s[n];

ll sum[n],ans[n];

int m, t1[n], t2[n], c[n], sa[n], rank[n], height[n];

int fa[n], mx[n], mn[n], a[n], stk[n], l[n], r[n], top = 1;

struct edgee[n];

int head[n], tot;

inline bool cmp(int *y, int p, int q, int k)

inline void build_sa()

}inline void build_height()

}inline void add(int u, int v)

inline int find(int x)

#define max(a, b) a = max(a, b)

#define min(a, b) a = min(a, b)

int main()

build_sa(), build_height();

rep(i, 0, n - 1) fa[i] = i, a[i] = mx[rank[i]] = mn[rank[i]] = read();

l[0] = 0;

rep(i, 1, n - 1)

r[stk[top = 1] = n - 1] = n - 1;

drp(i, n - 2, 0)

rep(i, 0, n - 1) add(height[i], i);

memset(ans, 128, sizeof ans);

drp(i, n - 1, 1)

} sort(a, a + n);

ans[0] = max((ll)a[0] * a[1], (ll)a[n - 1] * a[n - 2]);

sum[0] = (ll)n * (n - 1) / 2;

rep(i, 0, n - 1) printf("%lld %lld\n", sum[i], sum[i] ? ans[i] : 0);

return 0;

}

BZOJ4199 NOI2015 品酒大會

一年一度的 幻影閣夏日品酒大會 隆重開幕了。大會包含品嚐和趣味挑戰兩個環節,分別向優勝者頒發 首席品酒家 和 首席獵手 兩個獎項,吸引了眾多品酒師參加。在大會的晚餐上,調酒師rainbow調製了 n 杯雞尾酒。這 n 杯雞尾酒排成一行,其中第 i 杯酒 1 i n 被貼上了乙個標籤 s i 每個標籤...

品酒大會 BZOJ 4199

品酒大會 問題描述 輸入格式 輸出格式 樣例輸入 10ponoiiipoi 2 1 4 7 4 8 3 6 4 7 樣例輸出 45 56 10 56 3 32 0 00 0 0 00 0 0 00 0 0 0 資料範圍 題解 根據題意可得 r相似 也是 r 1相似 那麼我們只要求出了所有最大為 r ...

BZOJ 4197 Noi2015 壽司晚宴

為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n 現在小 g 和小 w ...