洛谷 P2178 品酒大会(bzoj P4199 [Noi2015]品酒大会/uoj P131【NOI2015】品酒大会)

微信小程序 - 最新详细实现 “餐厅食堂外卖点餐“ 全屏左右联动菜单列表功能界面,附带搜索框、购物车功能、商品加减计算金额、折扣等,左侧商品分类,右侧列表数据,仿美团饿了么外卖点餐页面,饭店扫码点餐! 微信小程序,vue2,vue3,左右联动菜单,商品分类页面,点餐界面,美团外卖点餐,左右布局界面,饿了么点餐页面,左分类右列表,小程序实现左侧菜单,外卖点餐联动,锚点,点击左侧大类后侧列表跟着变跟着刷新,菜单左右联动效果,左菜单右边列表数据,uniapp,左侧菜单,右侧列表双向联动效果,右侧商品滑动时,右侧列表双向联动效果,侧边菜单和右边滚动条,电商项目,购物车,商品加减计算,外卖选餐页面带购物车计算,自动计算金额,微信小程序外卖点餐界面源码,店铺页面滑动左右联动,点餐类小程序界面,堂食,扫码点餐,餐饮行业 阅读详情

传送门

这道题一看就是一种非常恶心的感觉,事实的确如此恶心到我饭都吃不下去。。

我恐怕真的不适合这个竞赛。。

这道题我想的是sa+单调栈然后全世界都比我快,全世界都用的是并查集。。

好吧说下zz的做法:首先我们想想求lcp的过程两个后缀的lcp=rmq min height(i,j),那么我们考虑height[i]并维护一个单调递增栈,如果height[i]<=height[stack[top]],那么height[stack[top]]对后面的height[j](j>i)没有贡献那么就弹出,只要知道它待在栈内的时间新加入了多少个后缀,就能知道它会被累加多少遍。很显然打一个时间戳就能记录height[stack[top]]对多少元素累加的次数。设L[i]表示i左边有多少元素height比它大对于比他的lcm肯定等于自身的height,所以两者相乘就是对于第i个height相似度为height[i]的个数,把所有累加起来就是相似度为height[i]的个数,至于最大值呢呢就用st表维护就好了。说的简单(思考的真是无比困难。。程序也是无比难打。。菜飞了我。。

PS:介于楼主表达能力有限所以有不懂的地方可以评论哟!!

注意:1.long long 2.s[i]可能为负,对于负的情况要维护最小值,所以不一定维护最大值即最大,两个负数乘起来有可能比两个正数乘起来大,神坑。。

代码:

#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
const int Maxn=300005;
const long long oo=2e18;
char s[Maxn];
int tax[Maxn],sa[Maxn],ranks[Maxn],height[Maxn],tp[Maxn];
int log2[Maxn],st[Maxn];
int Min[Maxn][20],Max[Maxn][20],a[Maxn],L[Maxn],times[Maxn];
long long sum[Maxn],Maxa[Maxn],Mina[Maxn],ans[Maxn];
int m=300,n,now=1,top;
inline long long max(long long x,long long y)
{
    return x>=y?x:y;
}
inline long long min(long long x,long long y)
{
    return x>=y?y:x;
}
inline void Rsort()
{
    for(int i=1;i<=m;i++)
        tax[i]=0;
    for(int i=1;i<=n;i++)
        tax[ranks[tp[i]]]++;
    for(int i=1;i<=m;i++)
        tax[i]+=tax[i-1];
    for(int i=n;i>=1;i--)
        sa[tax[ranks[tp[i]]]--]=tp[i];
}
inline int cmp(int *f,int x,int y,int w)
{
    return ((f[x]==f[y])&&(f[x+w]==f[y+w]));
}
inline void suffix()
{
    for(int i=1;i<=n;i++)
        ranks[i]=s[i],tp[i]=i;
    Rsort();
    for(int p=1,w=1,i;p<n;w+=w,m=p)
    {
        for(p=0,i=n-w+1;i<=n;i++)
            tp[++p]=i;
        for(i=1;i<=n;i++)
            if(sa[i]>w)
                tp[++p]=sa[i]-w;
        Rsort();
        swap(ranks,tp);
        ranks[sa[1]]=p=1;
        for(i=2;i<=n;i++)
            ranks[sa[i]]=cmp(tp,sa[i],sa[i-1],w)?p:++p;
    }
    for(int i=1,p,j;i<=n;height[ranks[i]]=j,i++)
        for(j=max(height[ranks[i-1]]-1,0),p=sa[ranks[i]-1];s[p+j]==s[i+j];j++);
}
inline long long rmqmin(int q1,int q2)
{
    return q1>q2?0x3f3f3f3f:min(Min[q1][log2[q2-q1+1]],Min[q2-(1<<log2[q2-q1+1])+1][log2[q2-q1+1]]);
}
inline long long rmqmax(int q1,int q2)
{
    return q1>q2?-0x3f3f3f3f:max(Max[q1][log2[q2-q1+1]],Max[q2-(1<<log2[q2-q1+1])+1][log2[q2-q1+1]]);
}
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    suffix();
    for(int i=0;i<=n;i++)
    {
        ans[i]=-oo;
        Maxa[i]=-oo;
        Mina[i]=oo;
    }
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    log2[0]=-1;
    for(int i=1;i<=n;i++)
        log2[i]=log2[i>>1]+1;
    for(int i=1;i<=n;i++)
    {
        Min[i][0]=a[sa[i]];
        Max[i][0]=a[sa[i]];
    }
    for(int j=1;j<=log2[n];j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            Min[i][j]=min(Min[i][j-1],Min[i+(1<<j-1)][j-1]);
            Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);
        }
    for(int i=2;i<=n;i++)
    {
        L[i]=i-1;
        Mina[i]=min(Mina[i],a[sa[i-1]]);
        Maxa[i]=max(Maxa[i],a[sa[i-1]]);
        while(top!=0&&height[st[top]]>=height[i])
        {
            int len=st[top]-L[st[top]],time_now=now-times[st[top]];
            L[i]=L[st[top]];
            sum[height[st[top]]]+=(long long)len*time_now;
            long long Ma=rmqmax(times[st[top]]+1,now),Mi=rmqmin(times[st[top]]+1,now);
            ans[height[st[top]]]=max(ans[height[st[top]]],Ma*Maxa[st[top]]);
            ans[height[st[top]]]=max(ans[height[st[top]]],Mi*Mina[st[top]]);
            Mina[i]=min(Mina[st[top]],Mina[i]);
               Maxa[i]=max(Mina[st[top]],Maxa[i]);
            Mina[i]=min(Maxa[st[top]],Mina[i]);
            Maxa[i]=max(Maxa[st[top]],Maxa[i]);
            top--;
        }
        st[++top]=i;
        times[i]=now;
        now++;
    }
    while(top!=0)
    {
        int len=st[top]-L[st[top]],time_now=now-times[st[top]];
        sum[height[st[top]]]+=(long long)len*time_now;
        long long Ma=rmqmax(times[st[top]]+1,now),Mi=rmqmin(times[st[top]]+1,now);
        ans[height[st[top]]]=max(ans[height[st[top]]],Ma*Maxa[st[top]]);
        ans[height[st[top]]]=max(ans[height[st[top]]],Mi*Mina[st[top]]);
        top--;
    }
    for(int i=n-1;i>=0;i--)
    {
        ans[i]=max(ans[i+1],ans[i]);
        sum[i]+=sum[i+1];
    }
    for(int i=0;i<n;i++)
        if(ans[i]==-oo)
        {
            ans[i]=0;
        }
    for(int i=0;i<n;i++)
        printf("%lld %lld\n",sum[i],ans[i]);
    return 0;
}


leetcode134 加油站 题目如下 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明: 如果题目有解,该答案即为唯一答案。 输入数组均为非空数组,且长度相同。 输... 阅读详情

相关推荐

软件缺陷(定义+表现形式+优先级+信息+产生原因),看完这篇文章就懂了

软件缺陷软件缺陷的定义软件缺陷的表现形式软件缺陷产生的原因软件缺陷的根源软件缺陷的费用软件缺陷的信息 软件缺陷的定义 IEEE 1983 of IEEE Stardard 729中软件缺陷做了一个标准的定义: 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。 因此软件缺陷就是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求。 缺陷不是bug,缺陷包含bug,缺陷的范围更大。 软件缺陷

qq_40676418的博客 1万+

【NOI2015】品酒大会

分析:首先可以想到 r 相似的两个子串肯定是满足 1...r-1 相似的,我们先求一遍后缀数组,根据 sa 数组的性质,0相似 即sa[1..n]整个区间,1 相似即将 1..n 划分成若干个区间,每个区间内的最长公共子串为 1,依次类推下去,则 一个 i-1 相似 的区间是由两个或多个 i 相似的区间合并的,类似并查集的合并过程。由此,我们可以以ht 数组的值从大到小遍历,维护...

Joker & Liar的博客 295

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

NOI 2015 品酒大会

#131. 【NOI2015】品酒大会 一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。 在大会的晚餐上,调酒师 Rainbow 调制了 n 杯鸡尾酒。这 n 杯鸡尾酒排成一行,其中第 n 杯酒 (1 ≤ i ≤ n) 被贴上了一个标签si,每个标签都是 26 个小写 英文字母...

weixin_30900589的博客 180

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

Win10右键新建菜单丢了记事本?别慌!5分钟教你用注册表找回来(附权限设置避坑指南)

本文详细指导如何通过注册表编辑器恢复Win10右键新建菜单中丢失的记事本选项,包括重建键值结构、配置ShellNew项及设置权限等关键步骤。特别提供权限避坑指南,确保修改持久有效,帮助用户快速解决这一常见但困扰的问题。

weixin_31714129的博客 856

[Luogu P2178] [BZOJ 4199] [NOI2015]品酒大会

洛谷传送门 BZOJ传送门 题目描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战 两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。 在大会的晚餐上,调酒师 Rainbow 调制了 nnn 杯鸡尾酒。这 nnn 杯鸡尾酒排成一行,其中第 nnn 杯酒 (1≤i≤n)(1 ≤ i ≤ n)(1≤i≤n) 被贴上了一个标签sis_isi​,每...

LPA的博客 368

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 686

bzoj4199&uoj131: [Noi2015]品酒大会

传送门:http://uoj.ac/problem/131 思路:先求出height,然后根据排名重新给后缀标号,按height从大到小做,每次合并i和i-1,用并查集维护,更新答案。 #include #include #include #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) const int maxn=300010; u

thy的专栏 1871

BeikeShop跨境电商独立站系统V1.5.0免授权全开源版

BeikeShop 一款开源好用的跨境电商系统,BeikeShop 是基于 Laravel 开发的一款开源商城系统,主要面向外贸/跨境电商行业提供商品管理、订单管理、会员管理、支付、物流、系统管理等功能。BeikeShop商城 Beike多语言商城 多货币商城B2C商城系统 代码100%开源 PHP商城系统 H5/PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 9 框架插件化开发,MVC架构 支持插件市场。Event 机制实现Hook功能,自定义可视化装修。

820

Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境

本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来!

超级大洋葱的博客 2584

[NOI2015]品酒大会

传送门 先对这个字符串求一下SA 考虑SA数组中第i位,暴力计算贡献就是向后枚举,然后计算枚举到的位与第i位之间height的最小值,然后对r==min(height)的贡献就是这一对数并且可以用他们的权值之积可以更新最大值 考虑height较大的是不会对height较小的有贡献,就可以从height大的到height小的依次计算 可以保证height较大的形成的集合通过当前height连在

Ostmbh的博客 487

ximalaya 新xm-sign逆向思路

本文主要介绍目标网站新xm-sign值的逆向思路。仅代表个人理解,如有其他建议可在评论区沟通。声明仅仅记录一下自己的学习方法,不作为其他参考、更不作为商业用途。如有侵犯请联系本人删除。

weixin_66580433的博客 2017

[洛谷P2178][BZOJ4199][UOJ#131][NOI2015]品酒大会(绝世好题)三种做法

Address 洛谷:https://www.luogu.org/problemnew/show/P2178 BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=4199 UOJ:http://uoj.ac/submissions?submitter=xyz32768 Meaning 输入 nnn 和一个长度为 nnn 的字符串,再...

女装的你,如此好看! 413

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[Noi 2015] 品酒大会

后缀数组+rmq

zhshrzhshr的博客 656

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

bzoj4199 [Noi2015]品酒大会

【题目描述】 一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。

wumingshi 515

4199: [Noi2015]品酒大会

bzoj上没有题面。。(百度有hhh) 这看上去就很后缀数组啊。。 先处理出后缀数组(都快忘了咋整了)。。 也就是处理出sa,rank,height三个数组 由后缀数组的性质,两个后缀的LCP是路径上height值取min 第i个位置的height值,能用作LCP的区间[L,R],满足区间最小height为height[i] 那么在[L,i)中选一位置为左端点,在[i,R]中选一位置作

CRZbulabula的博客 605

【BZOJ4199】品酒大会(NOI2015)-后缀数组+并查集

测试地址:品酒大会 做法:本题需要用到后缀数组+并查集。 不难想到,对题目所给的字符串构造后缀数组,那么后缀数组上两个后缀之间最小的heightheightheight就是这两杯酒满足的最大相似度。我们要求的,实际上是对于每个相似值kkk,对于后缀数组上heightheightheight大于等于kkk的边连接成的每个连续区间求出方案数和最大乘积,然后对方案数累加,对最大乘积取最大值。不难看出...

Maxwei_wzj的OI世界 390

[bzoj4199][NOI2015]品酒大会

4199: [Noi2015]品酒大会Time Limit: 10 Sec Memory Limit: 512 MB Submit: 418 Solved: 231 [Submit][Status][Discuss] Description一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。

Vampire 1450

洛谷P2178 [NOI2015]品酒大会——题解

题目传送门 题目大意: 有一个长为n的字符串,每一个字符有一个权值,称相同的两个长度为r的子串的开头是“1相似”、“2相似”、⋯⋯\cdots、“(r-1)相似”、“r相似”的,试问有多少k相似的字符(1&lt;=k&lt;=n)以及k相似的两个字符的权值积最大为多少。 思考过程: 我是在洛谷的后缀数组分类里找到这道题的,那么就先码一遍后缀数组的模板2333。 看过题目之后,我们发现...

CleverLarry的博客 332

[NOI2015]品酒大会 后缀数组+并差集

Descripition 给出一个长度为n的字符串,每个字符有一个权值。 定义两个子串满足r相似,当且仅当两个串长度为r,且字符都相等,那么这两个串的配对权值为开头权值相乘。 先让你求满足0~n-1相似的 子串有多少对。 最大的配对权值。 Sample Input 10 ponoiiipoi 2 1 4 7 4 8 3 6 4 7 Sample Output 45 5...

xgc_woker的博客 257

【NOI 2015】品酒大会

【NOI 2015】品酒大会 Problem Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了。大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加。 在大会的晚餐上,调酒师 Rainbow 调制了 \(n\) 杯鸡尾酒。这 \(n\) 杯鸡尾酒排成一行,其中第 \(i\) 杯...

洛水·锦依卫's Blog 251

【BZOJ4199】品酒大会,后缀数组+并查集维护

烦死了

xiaoyimi的博客 817

【BZOJ4199】品酒大会(后缀自动机)

题面BZOJ题解发现了一个很有趣的东西 后缀排序之后对heightheight排序,用并查集维护 和在后缀树上dpdp是一样的 所以这题用后缀树来dpdp 将串反着插入SAMSAM 构建后缀树 对于每个点维护最大值,最小值,和子树大小 每次只会更新u.longestu.longest位置的值 然后前缀和一下就是答案#include<iostream> #include<cstdio>

小蒟蒻yyb的博客 370
上一篇: 洛谷 P3773 [CTSC2017]吉夫特(bzoj P4903 [CTSC2017]吉夫特/uoj P300【CTSC2017】吉夫特)
下一篇: bzoj P4033 [HAOI2015]树上染色
Leo_Riddle
博客等级 码龄11年 4粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值