描述 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 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 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分!

相关文章: