bzoj 4199 && NOI 2015 品酒大会
一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。
在大会的晚餐上,调酒师 Rainbow 调制了 nn 杯鸡尾酒。这 nn 杯鸡尾酒排成一行,其中第 ii 杯酒 (1≤i≤n1≤i≤n) 被贴上了一个标签 sisi,每个标签都是 2626 个小写英文字母之一。设 Str(l,r)Str(l,r) 表示第 ll 杯酒到第 rr 杯酒的 r−l+1r−l+1 个标签顺次连接构成的字符串。若 Str(p,po)=Str(q,qo)Str(p,po)=Str(q,qo),其中 1≤p≤po≤n1≤p≤po≤n,1≤q≤qo≤n1≤q≤qo≤n,p≠qp≠q,po−p+1=qo−q+1=rpo−p+1=qo−q+1=r,则称第 pp 杯酒与第 qq 杯酒是“rr相似” 的。当然两杯“rr相似” (r>1r>1)的酒同时也是“11 相似”、“22 相似”、……、“(r−1)(r−1) 相似”的。特别地,对于任意的 1≤p,q≤n1≤p,q≤n,p≠qp≠q,第 pp 杯酒和第 qq 杯酒都是“00相似”的。
在品尝环节上,品酒师 Freda 轻松地评定了每一杯酒的美味度,凭借其专业的水准和经验成功夺取了“首席品酒家”的称号,其中第 ii 杯酒 (1≤i≤n1≤i≤n) 的美味度为 aiai。现在 Rainbow 公布了挑战环节的问题:本次大会调制的鸡尾酒有一个特点,如果把第 pp 杯酒与第 qq 杯酒调兑在一起,将得到一杯美味度为 apaqapaq 的酒。现在请各位品酒师分别对于 r=0,1,2,…,n−1r=0,1,2,…,n−1,统计出有多少种方法可以选出 22 杯“rr相似”的酒,并回答选择 22 杯“rr相似”的酒调兑可以得到的美味度的最大值。
输入格式
输入文件的第 11 行包含 11 个正整数 nn,表示鸡尾酒的杯数。
第 22 行包含一个长度为 nn 的字符串 SS,其中第 ii 个字符表示第 ii 杯酒的标签。
第 33 行包含 nn 个整数,相邻整数之间用单个空格隔开,其中第 ii 个整数表示第 ii 杯酒的美味度 aiai。
输出格式
输出文件包括 nn 行。第 ii 行输出 22 个整数,中间用单个空格隔开。第 11 个整数表示选出两杯“(i−1)(i−1)相似”的酒的方案数,第 22 个整数表示选出两杯“(i−1)(i−1)相似”的酒调兑可以得到的最大美味度。若不存在两杯“(i−1)(i−1)相似”的酒,这两个数均为 00。
我们从大往小枚举lcp,这样我们需要不停的合并一些区间并且查询一个位置所在区间的左右端点,并查集显然可以胜任。
用的st表,但预处理太慢在uoj上能过但在bzoj上会T掉,啊啊啊懒得卡常了。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define inf 1LL<<62
#define N 300005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int read()
{
char c=getchar();int p=,f=;
while(c<''||c>'')
{
if(c=='-')f=-;c=getchar();
}
while(c>=''&&c<='')p=p*+c-'',c=getchar();
return p*f;
}
char s[N];
int wb[N*],rank[N*],sa[N*],sum[N];
void da(int n,int m)
{
int *x=rank,*y=wb;
for(int i=;i<m;i++)sum[i]=;
for(int i=;i<n;i++)sum[x[i]=s[i]]++;
for(int i=;i<m;i++)sum[i]+=sum[i-];
for(int i=n-;i>=;i--)sa[--sum[x[i]]]=i;
int p=;
for(int j=;p<n;j<<=,m=p)
{
p=;
for(int i=n-j;i<n;i++)y[p++]=i;
for(int i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
for(int i=;i<m;i++)sum[i]=;
for(int i=;i<n;i++)sum[x[i]]++;
for(int i=;i<m;i++)sum[i]+=sum[i-];
for(int i=n-;i>=;i--)sa[--sum[x[y[i]]]]=y[i];
swap(x,y);x[sa[]]=;p=;
for(int i=;i<n;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+j]==y[sa[i-]+j]?p-:p++;
}
return ;
}
int h[N];
void cal(int n)
{
for(int i=;i<=n;i++)rank[sa[i]]=i;
int k=;
for(int i=;i<n;i++)
{
if(k)k--;
int j=sa[rank[i]-];
while(s[i+k]==s[j+k])k++;
h[rank[i]]=k;
}
return ;
}
ll ans[N][];
int n;
int v[N];
int f[N],g[N];
int findf(int x)
{
if(f[x]==x)return x;
return f[x]=findf(f[x]);
}
int findg(int x)
{
if(g[x]==x)return x;
return g[x]=findg(g[x]);
}
struct node
{
int pos,zhi;
friend bool operator < (node aa,node bb)
{
return aa.zhi>bb.zhi;
}
}q[N];
ll mn[N*][];//
ll mx[N*][];//
int lg[N*];
void st()
{
int now=;
for(int i=;i<=n;i*=)
{
for(int j=i;j<i<<;j++)
{
lg[j]=now;
}
now++;
}
for(int i=;i<=n;i++)mn[i][]=v[sa[i]],mx[i][]=v[sa[i]];
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
if(j+(<<(i-))<=n)mx[j][i]=max(mx[j][i-],mx[j+(<<(i-))][i-]);
else mx[j][i]=mx[j][i-];
if(j+(<<(i-))<=n)mn[j][i]=min(mn[j][i-],mn[j+(<<(i-))][i-]);
else mn[j][i]=mn[j][i-];
}
}
}
ll qurmx(int l,int r)
{
int k=lg[r-l+];
return max(mx[l][k],mx[r-(<<k)+][k]);
}
ll qurmn(int l,int r)
{
int k=lg[r-l+];
return min(mn[l][k],mn[r-(<<k)+][k]);
}
int main()
{
n=read();
scanf("%s",s);
ll mx1=-inf,mx2=-inf;
ll mn1=inf,mn2=inf;
for(int i=;i<n;i++)
{
v[i]=read();
if(v[i]>mx1)mx2=mx1,mx1=v[i];
else if(v[i]>mx2)mx2=v[i];
if(v[i]<mn1)mn2=mn1,mn1=v[i];
else if(v[i]<mn2)mn2=v[i];
}
da(n+,);
cal(n);st();
for(int i=;i<=n;i++)q[i].pos=i,q[i].zhi=h[i];
for(int i=;i<=n;i++)ans[i][]=-inf;
sort(q+,q+n+);
for(int i=;i<=n+;i++)f[i]=i,g[i]=i;
for(int i=;i<=n;i++)
{
if(q[i].zhi==)break;
int t=q[i].pos;
int aa=findf(t-);int bb=findg(t+);
ll q1=t-aa;ll q2=bb-t-;
ans[q[i].zhi][]+=q1*(q2+);
f[t]=aa;g[t]=bb;
ans[q[i].zhi][]=max(ans[q[i].zhi][],qurmx(aa,t-)*qurmx(t,bb-));
ans[q[i].zhi][]=max(ans[q[i].zhi][],qurmn(aa,t-)*qurmn(t,bb-)); }
for(int i=n-;i>=;i--)ans[i][]+=ans[i+][],ans[i][]=max(ans[i][],ans[i+][]);
ans[][]=(ll)n*((ll)n-)/;
ans[][]=max(mx1*mx2,mn1*mn2);
for(int i=;i<=n-;i++)
{
if(ans[i][])printf("%lld %lld\n",ans[i][],ans[i][]);
else puts("0 0");
}
return ;
}
bzoj 4199 && NOI 2015 品酒大会的更多相关文章
- [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会
[LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...
- [NOI 2015]品酒大会
Description 题库链接 \(n\) 杯鸡尾酒排成一行,其中第 \(i\) 杯酒 (\(1 \leq i \leq n\)) 被贴上了一个标签 \(s_i\),每个标签都是 \(26\) 个小 ...
- 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机+DP
题意 两个长度为$r$的子串相等称为$r$相似,两个$r$相似的权值等于子串开头位置权值乘积,给定字符串和每个位置权值,求$r$相似子串数量和最大权值乘积 对反串建立后缀自动机得到后缀树,后缀树上两个 ...
- NOI 2015 品酒大会 (后缀数组+并查集)
题目大意:略 40分暴力还是很好写的,差分再跑个后缀和 和 后缀最大值就行了 一种正解是后缀数组+并查集 但据说还有后缀数组+单调栈的高端操作蒟蒻的我当然不会 后缀数组求出height,然后从大到小排 ...
- 【BZOJ 4199】 [Noi2015]品酒大会
[链接]h在这里写链接 [题意] 给你一个长度为n的字符串s; 标志了每一杯酒; 以及n个数字,表示每一杯酒的美味度ai. 两杯酒(i,j)称为r相似 当且仅当 ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- BZOJ 4197 NOI 2015 寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- BZOJ 4197 NOI 2015 寿司晚宴
题面 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 ...
- [bzoj 4196][NOI 2015]软件包管理器
大概算是一道模板题吧? 就是细节有点多 罗列一下: 如果习惯从1开始搞树的编号的话,处理输入进来的那个依赖关系在加边的时候两个都要+1,体现在代码就是i要从2枚举到n,然后输入进来的那个数要+1 这道 ...
随机推荐
- 如何防范和应对Redis勒索,腾讯云教你出招
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 9月10日下午,又一起规模化利用Redis未授权访问漏洞攻击数据库的事件发生,此次 ...
- MFC -- Excel操作简介(基于VS2010)
一.添加与 Excel 操作相关的头文件 项目 -> 类向导,在右上方有一个下拉栏,选择其中的 类型库中的MFC类(T),即可看到下图所示界面,选择“文件”选项,然后在下方的位置选项中添加本地文 ...
- webbrowser 模块的 open()方法
webbrowser 模块的 open()函数可以启动一个新浏览器,打开指定的 URL.在交 互式环境中输入以下代码: >>> import webbrowser >>& ...
- CS小分队第二阶段冲刺站立会议(6月4日)
昨日成果:昨天一直在对主界面进行修改,遇到问题没有进展 遇到的问题:我代码写的不够缜密,各按钮信息添加的删除的时候总是有重名或者覆盖现象,需要有一次大的检查 今日计划:冲刺已经结束,项目的难度超过了预 ...
- Javascript toString()、toLocaleString()、valueOf()三个方法的区别
Array.Boolean.Date.Number等对象都具有toString().toLocaleString().valueOf()三个方法,那这三个方法有什么区别??? 一.JS Array 例 ...
- 冲刺One之站立会议7 /2015-5-20
2015-5-20 在登陆成功之后要实现的是聊天界面的交互过程,不同的IP进行信息和数据的传递,这方面我们上学期Java实验里面有过相关的内容,我们把它拿过来改了一下格式,试着看能不能成功,目前还没实 ...
- 软工实践-Beta 冲刺 (5/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 【贪心算法】POJ-1328 区间问题
一.题目 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, ...
- ThoughtWorks.QRCode类库
ThoughtWorks.QRCode一个二维码生成类库.
- 微服务负载均衡 —— ribbon
负载均衡是系统高可用.缓解网络流量和处理能力扩容的重要手段,广义的负载均衡指的是服务端负载均衡,如硬件负载均衡(F5)和软件负载均衡(Nginx).负载均衡设备会维护一份可用的服务器的信息,当客户端请 ...