AT_abc331_e [ABC331E] Set Meal 题解
题意
给定
数据范围
思路
先考虑没有
现在考虑有条件限制的情况,很容易发现对于一个
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int f[N][19],a[N],b[N],n,m,l,ans,LG[N];
vector<int> g[N];
void st_prework(){
for(int j=1;j<=log2(m);j++){
for(int i=1;i+(1<<j)-1<=m;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
}
return;
}
int query(int l,int r){
if(r<l)return 0;
int k=log2(r-l+1);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
signed main(){
scanf("%lld %lld %lld",&n,&m,&l);
LG[0]=-1;
for(int i=1;i<=max(n,m);i++)LG[i]=LG[i>>1]+1;
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=m;i++){
scanf("%lld",&b[i]);
f[i][0]=b[i];
}
for(int i=1;i<=l;i++){
int x,y;
scanf("%lld %lld",&x,&y);
g[x].push_back(y);
}
st_prework();
for(int i=1;i<=n;i++){
int res=0;
if(g[i].size()==0){
res=query(1,m);
}else{
sort(g[i].begin(),g[i].end());
int len=g[i].size();
res=max(res,query(1,g[i][0]-1));
for(int j=0;j<len-1;j++){
res=max(res,query(g[i][j]+1,g[i][j+1]-1));
}
res=max(res,query(g[i][len-1]+1,m));
}
ans=max(ans,res+a[i]);
}
printf("%lld\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧