zoukankan      html  css  js  c++  java
  • 七夕祭

     

    题目描述

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是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, 接下来输出最小交换次数,与字符串之间用一 个空格隔开。

    样例输入

    2 3 4
    1 3
    2 1
    2 2
    2 3
    

    样例输出

    row 1
    

    提示

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

    显然,在列上和在行上的操作是或不影响的,故将其分开来讨论。
    在单独处理行或列的时候就是分糖果问题(n个小朋友围成一圈,每人有a[i]颗糖果,只能给左边或右边的人,求均分的最小移动)
    
    分糖果问题的解决如下(来自hzwer的题解)
    首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示。
    假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友给了第i个小朋友Xi颗糖果,X1表示第一个小朋友给第n个小朋友的糖果数量。 所以最后的答案就是ans=|X1| + |X2| + |X3| + ……+ |Xn|。
    对于第一个小朋友,他给了第n个小朋友X1颗糖果,还剩A1-X1颗糖果;但因为第2个小朋友给了他X2颗糖果,所以最后还剩A1-X1+X2颗糖果。根据题意,最后的糖果数量等于ave,即得到了一个方程:A1-X1+X2=ave。
    同理,对于第2个小朋友,有A2-X2+X3=ave。最终,我们可以得到n个方程,一共有n个变量,但是因为从前n-1个方程可以推导出最后一个方程,所以实际上只有n-1个方程是有用的。
    尽管无法直接解出答案,但可以用X1表示出其他的Xi,那么本题就变成了单变量的极值问题。
    对于第1个小朋友,A1-X1+X2=ave  ->  X2=ave-A1+X1 = X1-C1(假设C1=A1-ave,下面类似)
    对于第2个小朋友,A2-X2+X3=ave  ->  X3=ave-A2+X2=2ave-A1-A2+X1=X1-C2
    对于第3个小朋友,A3-X3+X4=ave  ->  X4=ave-A3+X3=3ave-A1-A2-A3+X1=X1-C3
    ……
    对于第n个小朋友,An-Xn+X1=ave。
      我们希望Xi的绝对值之和尽量小,即|X1| + |X1-C1| + |X1-C2| + ……+ |X1-Cn-1|要尽量小。注意到|X1-Ci|的几何意义是数轴上的点X1到Ci的距离,所以问题变成了:给定数轴上的n个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数,证明略。
    #include<bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    using namespace std;
    const int N=1e6+5;
    int n,m,t;
    ll l[N],r[N],c[N],ans;
    void does()
    {
        if(t%n==0)
        {
            ll ave=t/n;
            for (int i=2;i<=n;i++) c[i]=c[i-1]+l[i]-ave;
            sort(c+1,c+1+n);
            ll mid=c[(n+1)/2];
            for(int i=1;i<=n;i++) ans+=abs(mid-c[i]);
         }
        if(t%m==0)
        {
            c[0]=0;
            ll ave=t/m;
            for (int i=2;i<=m;i++) c[i]=c[i-1]+r[i]-ave;
            sort(c+1,c+1+m);
            ll mid=c[(m+1)/2];
            for(int i=1;i<=m;i++) ans+=abs(mid-c[i]);
        }
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&t);
        int x,y;
        for (int i=1;i<=t;i++)
        {
            scanf("%d%d",&x,&y);
            l[x]++; r[y]++;
        }
        if (t%n==0&&t%m==0) printf("both ");
        else if (t%n==0) printf("row ");
        else if (t%m==0) printf("column ");
        else
        {
            printf("impossible
    ");
            return 0;
        }
        does();
        printf("%lld
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    datanode报错Problem connecting to server
    使用命令查看hdfs的状态
    Access denied for user root. Superuser privilege is requ
    ElasticSearch默认的分页参数 size
    SparkStreaming Kafka 维护offset
    【容错篇】Spark Streaming的还原药水——Checkpoint
    251 Android 线性与相对布局简介
    250 Android Studio使用指南 总结
    249 如何解决项目导入产生的中文乱码问题
    248 gradle更新问题
  • 原文地址:https://www.cnblogs.com/tetew/p/9314887.html
Copyright © 2011-2022 走看看