• BZOJ3032 七夕祭[中位数]


    发现是一个类似于“纸牌均分”的问题。然后发现,只要列数整除目标、行数整除目标就一定可以。

    如果只移动列,并不会影响行,也就是同一行不会多不会少。只移动行同理。

    所以可以把两个问题分开来看,处理起来互不干扰。

    然后就是一个经典的“环形纸牌均分”问题做两次即可。

    注意细节:如果有两个相邻的点,由题意,他们交换其实是浪费的,这表明,是否某列有点要向相邻列移动时没法过去?事实上发现是不会出现这种情况的。。可以分类(大于平均/小于平均)外加贪心来说明这一点。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define mst(x) memset(x,0,sizeof x)
     8 #define dbg(x) cerr << #x << " = " << x <<endl
     9 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
    10 using namespace std;
    11 typedef long long ll;
    12 typedef double db;
    13 typedef pair<int,int> pii;
    14 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    15 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    16 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    17 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    18 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    19 template<typename T>inline T read(T&x){
    20     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    21     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    22 }
    23 const int N=1e5+7;
    24 int a1[N],a2[N],s[N];
    25 int n,m,t,cl,ro;
    26 ll ans;
    27 
    28 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    29     read(n),read(m),read(t);
    30     for(register int i=1,x,y;i<=t;++i)read(x),read(y),++a1[y],++a2[x];
    31     if(t%m==0){
    32         cl=1;int ave=t/m,mid=m+1>>1;s[1]=0;
    33         for(register int i=2;i<=m;++i)s[i]=s[i-1]+ave-a1[i];
    34         sort(s+1,s+m+1);
    35         for(register int i=1;i<=m;++i)ans+=abs(s[mid]-s[i]);
    36     }
    37     if(t%n==0){
    38         ro=1;int ave=t/n,mid=n+1>>1;s[1]=0;
    39         for(register int i=2;i<=n;++i)s[i]=s[i-1]+ave-a2[i];
    40         sort(s+1,s+n+1);
    41         for(register int i=1;i<=n;++i)ans+=abs(s[mid]-s[i]);//dbg(s[i]);
    42     }
    43     if(ro&&cl)printf("both %lld
    ",ans);
    44     else if(ro)printf("row %lld
    ",ans);
    45     else if(cl)printf("column %lld
    ",ans);
    46     else puts("impossible");
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    法瑞意游记+攻略 一(巴黎 凡尔赛、荣军院,十二月二十六)
    [转]Exchange Server 2013部署系列之一:部署环境介绍
    [转]在Windows server 2012上部署DPM 2012 SP1 RTM之安装配置
    DinnerNow案例分析
    [转]DPM2012系列之六:在Win7上安装DPM远程管理控制台
    Windows Phone Dev Center Develop
    [转]DPM2012系列之十:备份exchange2010数据库
    [转]DPM2012系列之五:开启最终用户恢复功能
    Windows Phone Dev Center How do I join?
    [转]DPM2012系列之三:浅谈硬件需求
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11812387.html
Copyright © 2020-2023  润新知