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 这道 ...
随机推荐
- Go的CSP并发模型
golang的goroutine机制: 一.go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(g ...
- Visionpro介绍和下载安装视频教程
------------------------Halcon,Visionpro高清视频教程,点击下载视频--------------------------
- 学员管理系统(SQLAlchemy 实现)
一.业务逻辑 二.设计表结构 三.代码结构 start.py import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(os. ...
- Redis Jedis简介
Redis是一种基于内存类型的数据存储工具 Jedis是一个用java写的Redis数据库操作的客户端,通过Jedis,可以很方便的对redis数据库进行操作.Jedis通过Jedis Pool进行R ...
- sprint2(第六天)
昨天休息一天,今天继续做任务. 燃尽图:
- BugPhobia开发篇章:绩效管理的层次优化
0x00 :用0x00去书写一段故事 If you weeped for the missing sunset, you would miss all the shining stars 绩效管理,恐 ...
- 【Alpha】阶段第七次Scrum Meeting
[Alpha]阶段第七次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 增加上课信息接口 编写按学院搜索课程接口 赵智源 构建后测试点测试框架 构建前测试点测试 ...
- 面向对象OO第5-7次作业总结
面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...
- 20172321 2017-2018-2 《Java程序设计》第二周学习总结
20172321 2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第一章要点: 要点1 字符串:print和println用法的区别,字符串的拼接,java中 ...
- Sprint7
进展:根据昨天查到的资料,今天开始编写闹钟部分的代码,主要实现了闹钟添加事件显示时间主界面.