专栏文章
[CF1826E] Walk the Runway 题解
CF1826E题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @min1mkls
- 此快照首次捕获于
- 2025/12/01 19:05 3 个月前
- 此快照最后确认于
- 2025/12/01 19:05 3 个月前
首先可以直接 dp,先按 排序,设 表示考虑到第 个人且选择第 个人的最大价值,则转移为 ,其中 表示所有满足 的 构成的集合。注意到整个 dp 是 的,于是只需要快速求出 即可。
的 在 不同时很分散,难以维护,考虑一些暴力的做法。
若 ,则问题是简单的,维护一个集合 ,初始为空,按 从小到大往 中加入 ,则 就可以视作加入 之前的集合 ,不妨设此时的集合 为 。
接下来考虑 更大时的做法,我们一样可以对每一行维护 ,然后求出所有的 ,则 。
直接将 视作 bitset 即可维护。具体实现时不需要存储 ,只需要对每一行动态维护 并记录 即可。还需要注意 相等的情况。
时间复杂度 ,其中 ,CF 把时限卡这么满也是有点少见了。
code
CPP#include<bits/stdc++.h>
#define pb emplace_back
#define pob pop_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ll maxn=5007;
ll n,m,a[maxn],f[maxn],v[maxn],id[maxn],ans;
bitset<maxn> stt,g[maxn];
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>m>>n;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++) g[i][j]=1;
for(ll i=1;i<=m;i++){
stt.reset();
for(ll j=1;j<=n;j++) cin>>v[j],id[j]=j;
sort(id+1,id+1+n,[&](ll x,ll y){return v[x]<v[y];});
for(ll l=1,r;l<=n;l=r+1){
for(r=l;r<=n;r++){
g[id[r]]&=stt;
if(r==n||v[id[r]]!=v[id[r+1]]) break;
}
for(ll j=l;j<=r;j++) stt[id[j]]=1;
}
}
for(ll t=1,i,j;t<=n;t++){
i=id[t],f[i]=a[i];
for(ll x=1;x<t;x++){
j=id[x];
if(g[i][j]) f[i]=max(f[i],f[j]+a[i]);
}
ans=max(ans,f[i]);
}
cout<<ans<<"\n";
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...