C. Portal

超、凢脫俗 2022-09-14 03:08 254阅读 0赞

https://codeforces.com/contest/1581/problem/C

暴力n^4 方,当枚举最后一列之前,判断是否大于16,大于就剪枝,16是最坏情况下的修改数

为什么16是最坏情况呢?
想想,5行4列,四个边角不需要改变,那就是4*5 - 4 = 16;

先枚举行,再枚举列,枚举最后一列的时候,之前的矩形需要修改的数量已经是确定好了,如果已经确定好的数都大于最坏情况,直接break;

然后就是一些预处理啦, 保证每次在O(1)时间内算出当前方案需要修改的数。

  1. // Problem: C. Portal
  2. // Contest: Codeforces - Codeforces Round #745 (Div. 2)
  3. // URL: https://codeforces.ml/contest/1581/problem/C
  4. // Memory Limit: 256 MB
  5. // Time Limit: 1000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<string>
  11. #include<ctime>
  12. #include<cmath>
  13. #include<cstring>
  14. #include<algorithm>
  15. #include<stack>
  16. #include<climits>
  17. #include<queue>
  18. #include<map>
  19. #include<set>
  20. #include<sstream>
  21. #include<cassert>
  22. #include<bitset>
  23. #include<list>
  24. #include<unordered_map>
  25. using namespace std;
  26. #define ff first
  27. #define ss second
  28. #define lowbit(x) (x&-x)
  29. #define pf(a) printf("%d\n",a)
  30. #define mem(x,y) memset(x,y,sizeof(x))
  31. #define dbg(x) cout << #x << " = " << x << endl
  32. #define rep(i,l,r) for(int i = l; i <= r; i++)
  33. #define fep(i,a,b) for(int i=b; i>=a; --i)
  34. typedef pair<int,int> PII;
  35. typedef long long ll;
  36. typedef unsigned long long ull;
  37. const int N=500;
  38. int n, m;
  39. int a[N][N];
  40. int x[N][N], y[N][N], s[N][N];
  41. void solve()
  42. {
  43. mem(a,0);
  44. mem(x,0); // 计算某行的某个区间内0的个数
  45. mem(y,0); // 计算某列的某个区间内0的个数
  46. mem(s,0);
  47. cin >> n >> m;
  48. rep(i,1,n)
  49. {
  50. string str; cin >> str;
  51. str = " " + str;
  52. rep(j,1,m)
  53. {
  54. a[i][j] = str[j] - '0';
  55. x[i][j] = a[i][j] + x[i][j-1];
  56. if(a[i][j]==1)
  57. {
  58. s[i][j]=1+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  59. }
  60. else s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  61. }
  62. }
  63. for(int i = 1; i <= m; i++)
  64. {
  65. for(int j = 1; j<= n; j++)
  66. {
  67. y[j][i] = y[j-1][i] + a[j][i];
  68. }
  69. }
  70. int ans = 16;
  71. for(int i=1;i <= n; i++)
  72. {
  73. for(int j=i+4;j<=n;j++)
  74. {
  75. for(int k=1;k<=m;k++)
  76. {
  77. for(int z=k+3;z<=m;z++)
  78. {
  79. int all = 0;
  80. int x2 = j-1, y2 = z-1, x1 = i+1, y1 = k+1;
  81. int c1 = s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
  82. // 中间需要改成0的个数
  83. int c2 = z - k - 1 - (x[i][z-1]-x[i][k]); // 0的个数
  84. //上
  85. int c3 = z - k - 1 - (x[j][z-1]-x[j][k]);
  86. //下
  87. int c4 = j - i - 1 - (y[j-1][k]-y[i][k]);
  88. //左
  89. int sum = c1 + c2 + c3 + c4;
  90. if(sum > 16) break; // 如果这
  91. int c5 = j - i - 1 - (y[j-1][z]-y[i][z]);
  92. //右
  93. sum += c5;
  94. ans = min(ans, sum);
  95. }
  96. }
  97. }
  98. }
  99. cout << ans << endl;
  100. }
  101. int main()
  102. {
  103. int Case;scanf("%d", &Case);
  104. while(Case--)
  105. solve();
  106. return 0;
  107. }

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Portal研究

    Portal Portal说明 一个portal应用可通过复杂的个性化配置用户提供定制的内容,而portal页面就是含有不同的portlet为不同的用户生成

    相关 Angular cdk 学习之 Portals

           CDK里面Portals模块的功能就是将动态内容(这个内容可以是Component也可以是一个TemplateRef)呈现到应用程序中。更加直接点的解释就是把Po

    相关 bsp&&Portal Demo

    找朋友用3DMax做拉个简单的符合要求的场景,结果发现原来的程序在生成portal时有问题,现在已经修正拉这个问题。下一步要做的就是利用portal进行可见判断。现在有两种选择