• Wannafly Winter Camp 2020 Day 7F 草莓


    农场为一个 (nm) 的棋盘,初始位于第 (x) 行第 (y) 列,初始每个格子没草莓,每天早上每个格子长一个草莓,每天可以上下左右移动一次或不动,之后收获当前格子草莓,问 (k) 天后最多收多少草莓。

    Solution

    考虑答案的上界,假设我们一共走过了 (x) 个格子,答案的上界是这些格子最后剩下的草莓数量为 (0,1,2...,x-1)

    不妨设 (n leq m),显然在 (n>1) 时我们一定能达到上界

    考虑 (n=1) 的情况,设 (t=min(x-1,n-x)),即与左右边界的距离的较小值

    如果 (kleq n-t),即我们无法走到较远的那个边界,则答案为 (1,2,3,...,k)

    如果 (kgeq n+t),即我们可以到最近的边界,再回头走过整个区域,则答案为 (k,k-1,...,k-m)

    如果 (n-t<k<n+t),则我们可以先往比较宽阔的那边退几步,然后走回来,并恰好走到较近的那边,走到底,则答案为 (frac{k-(n-t)}{2}+1,...,k-1,k)

    构造题真是难受

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int mod = 998244353;
    const int i2 = (mod+1)/2;
    
    int solve(int l,int r) {
        l=max(l,0ll)%mod; r%=mod;
        return (l+r)*(r-l+1)%mod*i2%mod;
    }
    
    signed main() {
        int T,n,m,x,y,t,k;
        cin>>T;
        while(T--) {
            cin>>n>>m>>x>>y>>k;
            if(n>m) swap(n,m),swap(x,y);
            t=min(y-1,m-y);
            if(n==1 && m-t<k && k<m+t) cout<<solve((k-m+t)/2+1,k)<<endl;
            else cout<<solve(k-n*m+1,k)<<endl;
        }
    }
    
    
  • 相关阅读:
    传统IO拷贝与零拷贝技术比较
    NIO编程之多客户端聊天系统
    NIO编程模式示例
    java.nio.channels.IllegalBlockingModeException
    NIO之Buffer操作示例
    NIO之FileChannel操作示例
    Flask学习笔记04之路由重定向
    python对象之__call__方法
    在Android Studio中找不到AppCompatActivity解决方案
    信息反馈-冲刺04
  • 原文地址:https://www.cnblogs.com/mollnn/p/12378560.html
Copyright © 2020-2023  润新知