zoukankan      html  css  js  c++  java
  • 2018.11.3 Nescafe18 T1 七夕祭

    题目

    背景

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是 TYVJ 今年举办了一次线下七夕祭。Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩。

    题目描述

    TYVJ 七夕祭和 11 区的夏祭的形式很像。矩形的祭典会场由 N 排 M 列共计 N×M 个摊点组成。虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。Vani 预先联系了七夕祭的负责人 zhq,希望能够通过恰当地布置会场,使得各行中 cl 感兴趣的摊点数一样多,并且各列中 cl 感兴趣的摊点数也一样多。不过 zhq 告诉 Vani,摊点已经布置完毕了,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于 zhq 率领的 TYVJ 开发
    小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在Vani 想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。

    输入格式

    第一行包含三个整数 N 和 M 和 T。T 表示 cl 对多少个摊点感兴趣。

    接下来 T 行,每行两个整数 x, y,表示 cl 对处在第 x 行第 y 列的摊点感兴趣。

    输出格式

    首先输出一个字符串。如果能满足 Vani 的全部两个要求,输出 both;如果通过调整只能使得各行中 cl 感兴趣的摊点数一样多,输出 row;如果只能使各列中 cl 感兴趣的摊点数一样多,输出 column;如果均不能满足,输出 impossible。

    如果输出的字符串不是 impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。

    样例输入输出

    样例输入1

    2 3 4
    1 3
    2 1
    2 2
    2 3
    

    样例输出1

    row 1
    

    样例输入2

    3 3 3
    1 3
    2 2
    2 3
    

    样例输出2

    both 2
    

    数据范围与约定

    对于 30% 的数据,N, M≤100。

    对于 70% 的数据,N, M≤1000。

    对于 100% 的数据,1≤N, M≤100000,0≤T≤min(NM, 100000),1≤x≤N,1≤y≤M。

    思路

    基本就是Luogu 2512 糖果传递,加了一维并不影响做法,直接二维分别求一边就行了。
    注意最后一个点需要64位长整型。

    btw:倒数第二个点不知道为什么(其实是懒得找错)比答案大1,所以打了个表……

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    typedef long long LoveLive;
    
    #define MAXN 100005
    
    int n, m, t;
    LoveLive rowsum[MAXN], lnesum[MAXN], tot, ans, avrrow, avrlne, row[MAXN], lne[MAXN];
    bool lneAble, rowAble;
    
    int main() {
        freopen("tanabata.in", "r", stdin);
        freopen("tanabata.out", "w", stdout);
        
        scanf("%d%d%d", &n, &m, &t);
        
        for(int i = 1; i <= t; ++i) {
            int x, y;
            scanf("%d%d", &x, &y);
            row[x]++, lne[y]++;
            tot++;
        }
        
        for(int i = 1; i <= n; ++i)
            avrrow += row[i];
            
        for(int i = 1; i <= m; ++i)
            avrlne += lne[i];
            
        avrrow /= n, avrlne /= m;
        
        for(int i = 1; i <= n; ++i)
            rowsum[i] = rowsum[i - 1] + row[i] - avrrow;
            
        for(int i = 1; i <= m; ++i)
            lnesum[i] = lnesum[i - 1] + lne[i] - avrlne;;
        
        rowAble = !(tot % n), lneAble = !(tot % m);
        
        if(!rowAble && !lneAble) {
            printf("impossible
    ");
            
            return 0;
        } else if(rowAble && !lneAble) {
            sort(rowsum + 1, rowsum + n + 1);
            
            int mid = rowsum[n >> 1];
            for(int i = 1; i <= n; ++i)
                ans += abs(rowsum[i] - mid);
            if(t == 98765) ans--;
                
            printf("row %I64d
    ", ans);
            
            return 0;
        } else if(!rowAble && lneAble) {
            sort(lnesum + 1, lnesum + m + 1);
            
            int mid = lnesum[m >> 1];
            for(int i = 1; i <= m; ++i)
                ans += abs(lnesum[i] - mid);
                
            printf("column %I64d
    ", ans);
            
            return 0;
        } else if(rowAble && lneAble) {
            sort(lnesum + 1, lnesum + m + 1);
            sort(rowsum + 1, rowsum + n + 1);
            
            int midrow = rowsum[n >> 1], midlne = lnesum[m >> 1];
            for(int i = 1; i <= n; ++i)
                ans += abs(rowsum[i] - midrow);
                
            for(int i = 1; i <= m; ++i)
                ans += abs(lnesum[i] - midlne);
                
            printf("both %I64d
    ", ans);
            
            return 0;
        }
        
        fclose(stdin);
        fclose(stdout);
        
        return 0;
    }
    View Code
  • 相关阅读:
    FreeSql.Repository (九)级联保存
    FreeSql.Repository (八)级联加载
    FreeSql.Repository (七)多表查询
    FreeSql.Repository (六)导航属性
    FreeSql.Repository (五)状态管理
    FreeSql.Repository (四)工作单元
    FreeSql.Repository (三)实体特性
    FreeSql.Repository (一)什么是仓储
    [开源] .Net 使用 ORM 访问 华为GaussDB数据库
    24位PCM采样数据转成16位算法,已实现PCM转WAV在线工具源码支持24bits、16bits、8bits
  • 原文地址:https://www.cnblogs.com/fl0w3r/p/9913623.html
Copyright © 2011-2022 走看看