Codeforces Round #392 (Div. 2)-C. Unfair Poll(xjb)

记录一个菜逼的成长。。

题目链接

题目大意:
数数,从第1,…n排,再从第n-1,…,1排的顺序。问一个人被问最多和最少的次数和指定人的次数。

这题真的是xjb乱搞一通。。
特判只有一排和两排的。
以2*(n-1)*m为一轮
不满一轮的特判。
然后剩余k%2*(n-1)*m
暴力标记
最大的一定不在第一行和第n行。最小的一定在第n行。
不在第一行和第n行的每轮计算了两次,其他计算了一次。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn = 100 + 10;
LL num[maxn];
int vis[maxn][maxn];
int main()
{
    LL n,m,k,x,y;
    while(cin>>n>>m>>k>>x>>y){
        LL mx = 0,mn = 1LL<<60,ans;
        cl(num,0);
        cl(vis,0);
        if(n == 1){
            int t = k % m;
            LL mx = k / m,mn = k / m;
            if(t)mx++;
            LL ans;
            if(y <= t)ans = mx;
            else ans = mn;
            printf("%I64d %I64d %I64d\n",mx,mn,ans);
            continue;
        }
        LL c = k / (2*(n-1)*m);
        k = k % (2*(n-1)*m);
        if(n == 2){
            if(!k){
                mx = mn = c;
                ans = c;
            }
            else {
                mx = c + 1;
                mn = c;
                if((x-1)*m + y <= k)ans = mx;
                else ans = mn;
            }
            printf("%I64d %I64d %I64d\n",mx,mn,ans);
            continue;
        }

        num[1] = c;
        num[2] = 2 * c;
        for( int i = 1; i <= n && k; i++ ){
            for( int j = 1; j <= m && k; j++ ){
                vis[i][j]++;
                k--;
            }
        }
        for( int i = n-1; i >= 2 && k; i-- ){
            for( int j = 1; j <= m && k; j++ ){
                vis[i][j]++;
                k--;
            }
        }
        for( int i = 2; i < n; i++ ){
            for( int j = 1; j <= m; j++ ){
                mx = max(mx,(LL)vis[i][j]);
            }
        }
        if(!c){
            for( int i = 1; i <= n; i++ ){
                for( int j = 1; j <= m; j++ ){
                    mx = max(mx,(LL)vis[i][j]);
                    mn = min(mn,(LL)vis[i][j]);
                }
            }
            printf("%I64d %I64d %I64d\n",mx,mn,(LL)vis[x][y]);
            continue;
        }
        for( int i = 1; i <= m; i++ )mn = min(mn,(LL)vis[1][i]);
        for( int i = 1; i <= m; i++ )mn = min(mn,(LL)vis[n][i]);
        ans = vis[x][y];
        mx += num[2];
        mn += num[1];
        if(x > 1 && x < n)ans += num[2];
        else ans += num[1];
        printf("%I64d %I64d %I64d\n",mx,mn,ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值