射命丸文的取材之旅 题解
题目简述
给定序列
并输出该式子可能的最大值。
其中
数据范围:
题目传送门:P8445 射命丸文的取材之旅
题目分析
这是道最优化问题,关键点在于枚举对象的选择。
枚举
看到数据范围,我们发现了异常:
通常的思路为枚举区间,然后计算其中
枚举得到
这是很好理解的,可以将
那么我们就可以记录
但是有个问题,就如我们刚才所说,
code
#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
int n,a[N],ans=-1e9;
vector<int> pos[N];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1,b;i<=n;i++){
b=read();
if(b==a[i])pos[b].push_back(i); //记录x=b时的屏障的位置
}
for(int i=0;i<=n;i++){
pos[i].push_back(n+1); //对所有的x在区间末尾加一个屏障,方便计算
for(int j=0,before=1;j<pos[i].size();j++){
ans=max(ans,pos[i][j]-before-i);
before=pos[i][j]+1;
}
}
cout<<ans;
return 0;
}