首页 > 代码库 > [Poetize II]七夕祭

[Poetize II]七夕祭

描述 Description
  TYVJ七夕祭和11区的夏祭的形式很像。矩 形的祭典会场由N排M列共计N×M个摊点组成。虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。 Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。
    不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在Vani想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。
题解:
看了题目感觉好神,真的是第一题?
然后就不会做了,膜拜题解,顿时醒悟:
 实际上就是环形均分纸牌,贪心,减去平均值后构造前缀和数列取中位数即可。想不出贪心,枚举起始点O(n^2)也能70分。

好神!如果只有行,那么就是一个显然的环形均分纸牌,如果加上列的话,我们发现行列之间互不影响!所以在列上也做一遍就行了。
orz 好题,怒赞!
代码:
 1 #include<cstdio> 2  3 #include<cstdlib> 4  5 #include<cmath> 6  7 #include<cstring> 8  9 #include<algorithm>10 11 #include<iostream>12 13 #include<vector>14 15 #include<map>16 17 #include<set>18 19 #include<queue>20 21 #include<string>22 23 #define inf 100000000024 25 #define maxn 15000026 27 #define maxm 500+10028 29 #define eps 1e-1030 31 #define ll long long32 33 #define pa pair<int,int>34 35 #define for0(i,n) for(int i=0;i<=(n);i++)36 37 #define for1(i,n) for(int i=1;i<=(n);i++)38 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)40 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)42 43 #define mod 100000000744 45 using namespace std;46 47 inline int read()48 49 {50 51     int x=0,f=1;char ch=getchar();52 53     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}54 55     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}56 57     return x*f;58 59 }60 ll n,m,t,a[maxn],b[maxn],c[maxn],ans;61 62 int main()63 64 {65 66 67 68     n=read();m=read();t=read();69     for1(i,t)a[read()]++,b[read()]++;70     if(t%n==0)71     {72         ll tmp=t/n;73         c[1]=0;74         for2(i,2,n)c[i]=c[i-1]+a[i-1]-tmp;75         sort(c+1,c+n+1);76         ll x=c[n>>1];77         for1(i,n)ans+=abs(c[i]-x);78     }79     if(t%m==0)80     {81         ll tmp=t/m;82         c[1]=0;83         for2(i,2,m)c[i]=c[i-1]+b[i-1]-tmp;84         sort(c+1,c+m+1);85         ll x=c[m>>1];86         for1(i,m)ans+=abs(c[i]-x);87     }88     if(t%n==0)89     {90         if(t%m==0)printf("both %lld\n",ans);else printf("row %lld\n",ans);91     }92     else 93     {94         if(t%m==0)printf("column %lld\n",ans);else printf("impossible\n");95     }96 97     return 0;98 99 }
View Code
为毛一直WA了10分!
发现我WA的原因是我中位数找错了:
中位数应该是 a[(n+1)>>1]
而我是这样的 a[n>>1]
唉。。。
代码:
  1 #include<cstdio>  2   3 #include<cstdlib>  4   5 #include<cmath>  6   7 #include<cstring>  8   9 #include<algorithm> 10  11 #include<iostream> 12  13 #include<vector> 14  15 #include<map> 16  17 #include<set> 18  19 #include<queue> 20  21 #include<string> 22  23 #define inf 1000000000 24  25 #define maxn 150000 26  27 #define maxm 500+100 28  29 #define eps 1e-10 30  31 #define ll long long 32  33 #define pa pair<int,int> 34  35 #define for0(i,n) for(int i=0;i<=(n);i++) 36  37 #define for1(i,n) for(int i=1;i<=(n);i++) 38  39 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 40  41 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 42  43 #define mod 1000000007 44  45 using namespace std; 46  47 inline int read() 48  49 { 50  51     int x=0,f=1;char ch=getchar(); 52  53     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} 54  55     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();} 56  57     return x*f; 58  59 } 60 inline ll f(ll x){return x>0?x:-x;} 61 int n,m; 62 ll t,a[maxn],b[maxn],c[maxn],ans; 63  64 int main() 65  66 { 67  68     freopen("input.txt","r",stdin); 69  70     freopen("output.txt","w",stdout); 71  72     n=read();m=read();t=read(); 73     for1(i,t)a[read()]++,b[read()]++; 74     if(t%n==0) 75     { 76         ll tmp=t/n; 77         c[1]=0; 78         for2(i,2,n)c[i]=(ll)c[i-1]+a[i-1]-tmp; 79         sort(c+1,c+n+1); 80         ll x=c[n+1>>1]; 81         for1(i,n)ans+=f(c[i]-x); 82     } 83     if(t%m==0) 84     { 85         ll tmp=t/m; 86         c[1]=0; 87         for2(i,2,m)c[i]=(ll)c[i-1]+b[i-1]-tmp; 88         sort(c+1,c+m+1); 89         ll x=c[m+1>>1]; 90         for1(i,m)ans+=f(c[i]-x); 91     } 92     if(t%n==0) 93     { 94         if(t%m==0)printf("both %lld\n",ans);else printf("row %lld\n",ans); 95     } 96     else  97     { 98         if(t%m==0)printf("column %lld\n",ans);else printf("impossible\n"); 99     }100 101     return 0;102 103 }
View Code

 

[Poetize II]七夕祭