#ST表#CF1879F Last Man Standing
分析
当 \(x\) 大于最大值时一定可以被约化为等于的情况,考虑枚举 \(x\),
通过枚举倍数的方式可以知道存在若干段区间消耗同一精神状态的次数是相同的,那么区别就是其精神状态的差值。
那么可以用ST表维护精神状态次数的最大值和次大值,然后枚举倍数求出对于单个 \(x\) 的次数最大值次大值相减以求得最大值。
代码
#include <cstdio>
#include <cctype>
using namespace std;
const int N=200011; long long ans[N];
int lg[N],two[18],n,mx,h[N],a[N],f[N][18],g[N][18];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(long long ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int main(){
lg[0]=-1,two[0]=1;
for (int i=1;i<N;++i) lg[i]=lg[i>>1]+1;
for (int i=1;i<=lg[N-1];++i) two[i]=two[i-1]<<1;
for (int T=iut();T;--T){
n=iut(),mx=0;
for (int i=1;i<=n;++i) h[i]=iut();
for (int i=1;i<=n;++i){
a[i]=iut();
if (mx<a[i]) mx=a[i];
}
for (int i=1;i<=n;++i)
if (h[f[a[i]][0]]<h[i]) g[a[i]][0]=f[a[i]][0],f[a[i]][0]=i;
else if (h[g[a[i]][0]]<h[i]) g[a[i]][0]=i;
for (int j=1;j<=lg[mx];++j)
for (int i=1;i+two[j]-1<=mx;++i){
f[i][j]=f[i+two[j-1]][j-1],g[i][j]=g[i+two[j-1]][j-1];
if (h[f[i][j]]<h[f[i][j-1]]) g[i][j]=f[i][j],f[i][j]=f[i][j-1];
else if (h[g[i][j]]<h[f[i][j-1]]) g[i][j]=f[i][j-1];
if (h[g[i][j]]<h[g[i][j-1]]) g[i][j]=g[i][j-1];
}
for (int i=1;i<=mx;++i){
int fi=0,se=0;
for (int j=1;j<=mx;j+=i){
int l=j,r=j+i>mx?mx:j+i-1,z=lg[r-l+1];
int Fi=f[r-two[z]+1][z],Se=g[r-two[z]+1][z];
if (h[Fi]<h[f[l][z]]) Se=Fi,Fi=f[l][z];
else if (Fi!=f[l][z]&&h[Se]<h[f[l][z]]) Se=f[l][z];
if (h[Se]<h[g[l][z]]) Se=g[l][z];
if ((a[fi]+i-1ll)/i*h[fi]<(a[Fi]+i-1ll)/i*h[Fi]) se=fi,fi=Fi;
else if ((a[se]+i-1ll)/i*h[se]<(a[Fi]+i-1ll)/i*h[Fi]) se=Fi;
if ((a[se]+i-1ll)/i*h[se]<(a[Se]+i-1ll)/i*h[Se]) se=Se;
}
long long _fi=(a[fi]+i-1ll)/i*h[fi],_se=(a[se]+i-1ll)/i*h[se];
if (ans[fi]<_fi-_se) ans[fi]=_fi-_se;
}
for (int i=1;i<=n;++i) print(ans[i]),putchar(i==n?10:32);
for (int i=0;i<=n;++i) ans[i]=0;
for (int i=1;i<=mx;++i) f[i][0]=g[i][0]=0;
}
return 0;
}
#ST表#CF1879F Last Man Standing的更多相关文章
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
- 【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 459 Solved: 209[Submit][Status] ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
- HDU5726 GCD(二分 + ST表)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...
- Hdu 5289-Assignment 贪心,ST表
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- ST表poj3264
/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans ...
- COJ 1003 WZJ的数据结构(三)ST表
WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...
随机推荐
- 具备有效期的sessionStorage存储
具备有效期的sessionStorage存储 类方式 // 具备有效期的sessionStorage存储-类方式. class SessionStorageWrapper { // 存储数据到sess ...
- pinject依赖注入模块
pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能. 下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入. 首先,我们需要安装 pinje ...
- 【Azure 应用服务】应用服务中发布Docker Container,如何添加卷(如Azure File Share)以便永久存储文件
问题描述 应用服务中发布Docker Container,如何添加卷(如Azure File Share)以便永久存储文件 问题解答 App Service可以通过门户配置Mount Storage, ...
- 【Azure 事件中心】China Azure上是否有Kafka服务简答
问题描述 China Azure 上是否有Kakfa服务可以使用呢? 问题回答 China Azure并没有专门的Kafka服务,但是可以使用Azure Event Hub. 创建标准版及以上的Eve ...
- 利用微软官方API实现Office文档的在线预览功能
随着互联网时代的飞速发展,越来越多的工作开始依赖于云端服务,我们的办公方式也逐渐发生了翻天覆地的变化.在这种背景下,急需一种无需本地安装Office软件,就能快速查看和共享Word.PowerPoin ...
- STL-bitset模拟实现
#include<time.h> #include<string> #include<vector> #include<iostream> using ...
- C++ Qt开发:QHostInfo主机地址查询组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHo ...
- 十步带你用IDEA创建一个WEB项目及部署(Tomcat)
部署一个web项目首先需要安装Tomcat,还没安装的朋友们可以看一下我这个博客: https://www.cnblogs.com/deyo/p/17241878.html 第一步:打开Idea-新建 ...
- 火柴 基于everything的搜索软件 软件推荐 Ctrl+Ctrl 显示 tab转换 本机搜索和网络搜索
https://www.huochaipro.com/
- 适合新手练习的python开源经典源码
一 前记 python学习离不开三要素: A.基础知识要熟悉 B. 练习源码要够量 C.实战项目要跟上 二 链接 书本的基础就看几本书就可以了,这里给出源码练习的经典开源源码: 该链接集合了pytho ...