当前位置:   article > 正文

C. Triangles(思维+贪心+暴力枚举)

c. triangles

https://codeforces.com/problemset/problem/1453/C


思路:

保证有一条边是平行的,那就枚举这个边。

开始的思路是枚举O(10*2000*2000)枚举遍历到的点改成k,然后通过提前预处理出来的该行最右边,该行最左边,该列最上面,该列最下面的k的位置,然后取出来答案,确实能做。但是代码量会有一点繁琐并且思维上不够简洁。

我们把改的点最后用贪心构造的方式处理,先提前处理好k这个数的最上面行位置,最下面行位置,最左边行位置,最右边行位置,然后O(2000*2000)枚举,对于枚举到的这个k,我们让他对四个方向分别取一个最值。这里举一个例子。

第3行中有个2,一个最值来源于下方的最远的2的行与第3行的差,然后题目要求平行,不管下面这个与现在平行与否,我将修改的点扔在该行的最左或者最右边肯定最优且符合条件,然后O(2000*2000)扫一下就好了。(甚至还少了10的常数呢)

  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<map>
  7. #include<set>
  8. #include<cstdio>
  9. #include<algorithm>
  10. #define debug(a) cout<<#a<<"="<<a<<endl;
  11. using namespace std;
  12. const int maxn=2e3+100;
  13. typedef long long LL;
  14. inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
  15. return x*f;}
  16. LL maxx[maxn],minx[maxn],maxy[maxn],miny[maxn];
  17. LL a[maxn][maxn];
  18. char s[maxn][maxn];
  19. LL ans[20];
  20. int main(void)
  21. {
  22. cin.tie(0);std::ios::sync_with_stdio(false);
  23. LL T;cin>>T;
  24. while(T--){
  25. LL n;cin>>n;
  26. for(LL i=0;i<n+10;i++) maxx[i]=0,minx[i]=n,maxy[i]=0,miny[i]=n;
  27. for(LL i=0;i<20;i++) ans[i]=0;
  28. for(LL i=1;i<=n;i++){
  29. for(LL j=1;j<=n;j++) cin>>s[i][j];
  30. }
  31. for(LL i=1;i<=n;i++){
  32. for(LL j=1;j<=n;j++) a[i][j]=(s[i][j]-'0');
  33. }
  34. for(LL i=1;i<=n;i++){
  35. for(LL j=1;j<=n;j++){
  36. LL t=a[i][j];
  37. maxx[t]=max(maxx[t],i);
  38. minx[t]=min(minx[t],i);
  39. maxy[t]=max(maxy[t],j);
  40. miny[t]=min(miny[t],j);
  41. }
  42. }
  43. for(LL i=1;i<=n;i++){
  44. for(LL j=1;j<=n;j++){
  45. LL t=a[i][j];
  46. ans[t]=max(ans[t],abs(maxx[t]-i)*max(n-j,j-1) );
  47. ans[t]=max(ans[t],abs(i-minx[t])*max(n-j,j-1) );
  48. ans[t]=max(ans[t],abs(maxy[t]-j)*max(n-i,i-1) );
  49. ans[t]=max(ans[t],abs(miny[t]-j)*max(n-i,i-1) );
  50. }
  51. }
  52. for(LL i=0;i<10;i++){
  53. cout<<ans[i]<<" ";
  54. }
  55. cout<<"\n";
  56. }
  57. return 0;
  58. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/900011
推荐阅读
相关标签
  

闽ICP备14008679号