洛谷 P2178 [NOI2015]品酒大会 解题报告
P2178 [NOI2015]品酒大会
题目描述
一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。
在大会的晚餐上,调酒师 Rainbow 调制了 \(n\) 杯鸡尾酒。这 \(n\) 杯鸡尾酒排成一行,其中第 \(n\) 杯酒 \((1 ≤ i ≤ n)\) 被贴上了一个标签\(s_i\),每个标签都是 26 个小写 英文字母之一。设 \(str(l, r)\) 表示第 \(l\) 杯酒到第 \(r\) 杯酒的 \(r − l + 1\) 个标签顺次连接构成的字符串。若 \(str(p, po) = str(q, qo)\),其中 \(1 ≤ p ≤ po ≤ n\), \(1 ≤ q ≤ qo ≤ n\), \(p ≠ q\), \(po − p + 1 = qo − q + 1 = r\) ,则称第 \(p\) 杯酒与第 \(q\) 杯酒是“ \(r\) 相似” 的。当然两杯“ \(r\) 相似”(\(r > 1\))的酒同时也是“ \(1\) 相似”、“ \(2\) 相似”、……、“ \((r − 1)\) 相似”的。特别地,对于任意的 \(1 ≤ p , q ≤ n\) , \(p ≠ q\) ,第 \(p\) 杯酒和第 \(q\) 杯酒都 是“ \(0\) 相似”的。
在品尝环节上,品酒师 Freda 轻松地评定了每一杯酒的美味度,凭借其专业的水准和经验成功夺取了“首席品酒家”的称号,其中第 \(i\) 杯酒 (\(1 ≤ i ≤ n\)) 的 美味度为 \(a_i\) 。现在 Rainbow 公布了挑战环节的问题:本次大会调制的鸡尾酒有一个特点,如果把第 \(p\) 杯酒与第 \(q\) 杯酒调兑在一起,将得到一杯美味度为 \(a_p*a_q\) 的 酒。现在请各位品酒师分别对于 \(r = 0,1,2, ⋯ , n − 1\) ,统计出有多少种方法可以 选出 \(2\) 杯“ \(r\) 相似”的酒,并回答选择 \(2\) 杯“ \(r\) 相似”的酒调兑可以得到的美味度的最大值。
输入输出格式
输入格式:
第 \(1\) 行包含 \(1\) 个正整数 \(n\) ,表示鸡尾酒的杯数。
第 \(2\) 行包含一个长度为 \(n\) 的字符串 \(S\),其中第 \(i\) 个字符表示第 \(i\) 杯酒的标签。
第 \(3\) 行包含 \(n\) 个整数,相邻整数之间用单个空格隔开,其中第 \(i\) 个整数表示第 \(i\) 杯酒的美味度 \(a_i\) 。
输出格式:
包括 \(n\) 行。第 \(i\) 行输出 \(2\) 个整数,中间用单个空格隔开。第 \(1\) 个整 数表示选出两杯“ \((i − 1)\) 相似”的酒的方案数,第 \(2\) 个整数表示选出两杯 “ \((i − 1)\) 相似”的酒调兑可以得到的最大美味度。若不存在两杯“ \((i − 1)\) 相似” 的酒,这两个数均为 \(0\) 。
说明
没什么思维,但是窝写了巨久无比,代码能力还是太差了...
思路:
SA求出height,然后单调栈求出每个height可以向左or向右延伸的长度,然后对于每个height对应的左右区间,随便更新一下就好了。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using std::min;
using std::max;
const int N=3e5+10;
int tax[N],sec[N],Rank[N],sa[N],hei[N],m;
ll ans[N],sum[N];
int mx[N],mi[N],n,tot,sta[N],p[N],L[N],R[N];
char s[N];
void Rsort()
{
for(int i=0;i<=m;i++) tax[i]=0;
for(int i=1;i<=n;i++) ++tax[Rank[i]];
for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
for(int i=n;i;i--) sa[tax[Rank[sec[i]]]--]=sec[i];
}
bool cmp(int x,int y,int l){return sec[x]==sec[y]&&sec[x+l]==sec[y+l];}
void SuffixSort()
{
for(int i=1;i<=n;i++) Rank[i]=s[i]-'a'+1,sec[i]=i;
m=26;Rsort();
for(int p=0,w=1;p<n;w<<=1,m=p)
{
p=0;for(int i=n-w+1;i<=n;i++) sec[++p]=i;
for(int i=1;i<=n;i++) if(sa[i]>w) sec[++p]=sa[i]-w;
Rsort(),std::swap(Rank,sec);
Rank[sa[1]]=p=1;
for(int i=2;i<=n;i++) Rank[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
}
for(int k=0,j,i=1;i<=n;hei[Rank[i]]=k,i++)
for(k=k?k-1:k,j=sa[Rank[i]-1];s[i+k]==s[j+k];k++);
}
struct node
{
int l,r;
node(){}
node(int l,int r){this->l=l,this->r=r;}
ll friend operator +(node a,node b)
{
return max(max(1ll*a.l*b.l,1ll*a.r*b.r),max(1ll*a.l*b.r,1ll*a.r*b.l));
}
}beel[N],beer[N];
int main()
{
scanf("%d%s",&n,s+1);
SuffixSort();
for(int i=1;i<=n;i++) scanf("%d",p+i);
for(int i=2;i<=n;i++)
{
int nmi=p[sa[i-1]],nmx=nmi;
while(tot&&hei[sta[tot]]>=hei[i])
{
nmi=min(nmi,mi[tot]);
nmx=max(nmx,mx[tot]);
--tot;
}
L[i]=tot?sta[tot]:1;
sta[++tot]=i,mi[tot]=nmi,mx[tot]=nmx;
beel[i]=node(mi[tot],mx[tot]);
}
tot=0;
for(int i=n;i>1;i--)
{
int nmi=p[sa[i]],nmx=nmi;
while(tot&&hei[sta[tot]]>hei[i])
{
nmi=min(nmi,mi[tot]);
nmx=max(nmx,mx[tot]);
--tot;
}
R[i]=tot?sta[tot]:n+1;
sta[++tot]=i,mi[tot]=nmi,mx[tot]=nmx;
beer[i]=node(mi[tot],mx[tot]);
}
memset(ans,-0x3f,sizeof(ans));
for(int i=2;i<=n;i++) sum[hei[i]]+=1ll*(i-L[i])*(R[i]-i),ans[hei[i]]=max(ans[hei[i]],beel[i]+beer[i]);
for(int i=n-2;~i;i--) sum[i]+=sum[i+1],ans[i]=max(ans[i],ans[i+1]);
for(int i=0;i<n;i++) printf("%lld %lld\n",sum[i],ans[i]==ans[n]?0:ans[i]);
return 0;
}
2019.1.11
洛谷 P2178 [NOI2015]品酒大会 解题报告的更多相关文章
- 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈
P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...
- 洛谷P2178 [NOI2015]品酒大会
题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加. 在大会的晚餐上,调酒师 Rainb ...
- 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
随机推荐
- Android应用安全之WEB接口安全
Android应用安全不仅包括客户端的安全,也包括web接口的安全.移动App中的Web接口安全主要分为以下几块: 1.SQL注入漏洞 这是一个不能再常见的漏洞类型了,由于App的特性,开发人员认为使 ...
- WPF编程,通过Path类型制作沿路径运动的动画另一种方法。
原文:WPF编程,通过Path类型制作沿路径运动的动画另一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/d ...
- win7笔记本VirtualBox安装黑苹果MacOS 10.13
环境 时间:2018.04.09,没有指明时间的教程都是耍流氓 笔记本:某州优雅A460P-i7G D2,4G内存,Intel Core i7-2670QM四核八线程(老笔记本勉强能用),ssd硬盘, ...
- Egret(白鹭引擎)——Egret+fairyGui 实战项目入门
前言 一行白鹭上青天 需求 最近,我们老板刷刷的为了省事,给美术减压(背景有点长,不说了). 美术出 fairygui,我需要在网页上看到实时操作,并且看到效果! 需求分析 这怕是要了我的狗命啊,但是 ...
- 基于.NET Standard的分布式自增ID算法--Snowflake
概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法.搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier. 那么为何还要引 ...
- 记录:tf.saved_model 模块的简单使用(TensorFlow 模型存储与恢复)
虽然说 TensorFlow 2.0 即将问世,但是有一些模块的内容却是不大变化的.其中就有 tf.saved_model 模块,主要用于模型的存储和恢复.为了防止学习记录文件丢失或者蠢笨的脑子直接遗 ...
- [转]申瓯 JSY2000-06 程控电话交换机呼叫转移设置
说明:若申瓯程控电话交换机分机有事不在位置上或遇忙分机正忙时为使某些重要来话不丢失,可设置将呼入本机的电话转移至其他分机及公网固定电话或手机.电话交换机使用了本功能不管分机用户在什么地方都能接听到办公 ...
- 前端菜鸟起飞之学会ps切图
由于之前只顾着追求效率,没有学习过PS,但其实这是前端开发人员需要学会的技能之一,曾经看过一个大佬的前端经验分享说他在招聘时遇到不会切图的会直接pass掉,可见前端开发人员学会切图是多么重要.通过观看 ...
- Test Cases
对于mode1 1 路径下一个空文件夹 结果:生成一个空的txt 2路径下一个文件夹内包含一个txt内容为abd(最基本的一个单词) 3路径下一个空文件夹一个txt,txt内容为以不同符号 ...
- Linux第七周学习总结——可执行程序的装载
Linux第七周学习总结--可执行程序的装载 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...