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 这道 ...
随机推荐
- UI设计学习笔记(7-12)
UI学习笔记(7)--扁平化图标 认识扁平化 Flat Design 抛弃传统的渐变.阴影.高光等拟真视觉效果,打造看上去更平的界面.(颜色.形状) 扁平化图标有什么优缺点 优点: 简约不简单.有新鲜 ...
- c++ undefinede reference to 构造函数/析构函数
g++编译器问题 把头文件"a.h"和头文件实现文件"a.cpp"都include就解决了.
- netcore如何引用package?
netcore项目引用dll包,分如下三种: 1.引用网络包 从nuget获取,然后引入,使用命令:dotnet add package 包名 然后:dotnet restore 2.引用同解决方案的 ...
- 方正 ignb路由器设置备份(自用笔记)
192.168.15.96255.255.255.0192.168.15.1219.232.46.61219.141.136.10
- eclipse xml文件中按alt+/没有提示信息
转载地址:http://blog.sina.com.cn/s/blog_972ddc1b01012mmh.html 今天要写这篇博文是因为遇到这样的不是技术的问题,但找到问题根源再解决这个问题又花费很 ...
- 欢迎来怼--第三十七次Scrum会议
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/12/3 17:50~18:23,总计33min. 地点 ...
- 20172308 实验三《Java面向对象程序设计 》实验报告
20172308 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...
- python处理xml实例
""" Author = zyh FileName = read_xml_1.py Time = 18-9-26 下午5:19 """ fr ...
- 使你的WebService可以远程调试点击“调用”
默认发布webservice时,只有在本机访问某个方法时可以点击调用,如果有参数时,也可以输入参数值,但是如果是远程访问时,点击进入一个服务时,是不显示“调用”和输入参数框的. 原来web.confi ...
- 词频统计的java实现方法——第一次改进
需求概要 原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 ...