結果
| 問題 |
No.2434 RAKUTAN de RAKUTAN
|
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2023-08-15 22:31:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 105 ms / 2,000 ms |
| コード長 | 937 bytes |
| コンパイル時間 | 2,320 ms |
| コンパイル使用メモリ | 203,908 KB |
| 最終ジャッジ日時 | 2025-02-16 08:32:14 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(p) p.begin(),p.end()
#define rep(i,a,b) for(int i=(int)a;i<(int)b;i++)
int main(){
int N,H,X;
cin>>N>>H>>X;
set<int> s;
auto f=[&]()->vector<int>{
int n;
cin>>n;
vector<int> p(n);
rep(i,0,n){
cin>>p[i];
rep(k,1,X) if(p[i]-k>=0&&p[i]-k+X<=N) s.insert(p[i]-k);
}
return p;
};
auto p=f(),q=f();
H=min(H,(int)p.size()+(int)q.size());
vector<int> order;
for(auto x:s) order.push_back(x);
int L=order.size();
vector dp(L+1,vector<int>(H+1));
rep(i,0,L){
int val=0;
int to=i;
while(to!=L&&order[i]+X>order[to]) to++;
for(auto x:p) if(order[i]<x&&x<order[i]+X) val--;
for(auto x:q) if(order[i]<x&&x<order[i]+X) val++;
rep(j,0,H){
dp[to][j+1]=max(dp[to][j+1],dp[i][j]+val);
}
rep(j,0,H+1){
dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
}
}
int ans=dp[L][H];
ans+=(int)p.size();
ans-=(int)q.size();
cout<<ans<<"\n";
}
potato167