「题解」Codeforces 1612F Armor and Weapons
do_while_true · · 题解
首先可以不管套件,假定
答案这么小,那么常见的套路就是把答案放进复杂度里。
然后考虑一个 dp,假设当且在第
不用套件的转移,购买盔甲是
用套件的话,那么一定是用
通过打 tag 然后从后往前取 max 可以做到单次
const int N=200010;
int n,m,q,x,y,ans,f[N],g[N],fl;
map<int,int>vis[N];
void solve(){
read(n,m,q);
if(n>m)swap(n,m),fl=1;
while(q--)read(x,y),fl?swap(x,y),0:0,vis[x][y]=1;
f[1]=1;
for(;f[n]<m;++ans){
for(int i=1;i<=n;i++)if(f[i]){
int k=vis[i][f[i]];
cmax(g[min(n,i+f[i]+k)],f[i]);
cmax(g[i],min(m,i+f[i]+k));
}
for(int i=n;i>=1;i--)f[i]=max(g[i],f[i+1]),g[i]=0;
}
cout << ans << '\n';
}