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

转载于:https://www.cnblogs.com/butterflydew/p/10256374.html

洛谷 P2178 [NOI2015]品酒大会 解题报告相关推荐

  1. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  2. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  3. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  4. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  5. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  7. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  8. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  9. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

最新文章

  1. 2021年大数据ELK(三):Lucene全文检索库介绍
  2. 对数函数定义域和值域_呆哥数学每日一题 —— 复合函数值域
  3. 使用rsync同步网路备份
  4. win10如何改变鼠标的形状和颜色?
  5. 安装Python3的工具包报Microsoft Visual C++ 14.0 is required的错误
  6. 欢迎使用CSDN-markdown编辑器保存
  7. 数模论文研读--------09年B题:眼科病床
  8. 在线等差数列求和计算器
  9. Leetcode 746.使用最小花费爬楼梯
  10. 华工计算机学院专硕分数线,2017华南理工大学
  11. 服务器数据收发测试软件,sokit TCP/UDP 数据包收发测试(调试)工具(Win32)
  12. app软件怎么开发 盘点3种app制作方式
  13. 使用axure9绘制三级导航
  14. Alibaba微服务组件Nacos单机+集群配置 prometheus+grafana监控配置及注册中心实战【收获满满】
  15. 测试工作干了8年,却被实习生代替,是实习生太牛了,还是我们太弱了?
  16. 7z 头部错误 数据错误_7z解压软件(7-zip)解压错误怎么办?
  17. 计算机音乐数字谱铃舟,天涯明月刀手游音乐曲谱大全 天涯明月刀曲谱大全简单图片...
  18. 山西中级消防设施操作员考前必背考点,模拟真题及答案
  19. Nginx——nginx作为静态资源web服务(CDN场景)
  20. 项目管理之研发人员的考核

热门文章

  1. choice python接口,数据可视化环境(Python接口)配置
  2. 你也可以浪漫----倾情奉献一份你值得拥有的浪漫网站(情人节快来了~)
  3. python创建一个上三角矩阵(没有初等行变化)
  4. 7-18 出租车计价
  5. 开源物联网系统 ThingsBoard 上手
  6. 肯德基推出“爷爷自在茶”,多赛道起跑是否会押中又一个宝
  7. 备份存储(基础概念)
  8. Missing $ inserted解决方法
  9. 基于普中科技的单片机开发实验仪编写的数字表
  10. SCAU 数字电路 Digital Circuits and Logic Design 复习