[关闭]
@994495jj 2017-07-29T01:31:36.000000Z 字数 1584 阅读 716

hdu6052

201707


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define pb push_back
  6. #define sz(a) (int)a.size()
  7. #define mp make_pair
  8. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  9. #define de(a) cout<<#a<<"="<<a<<endl;
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //--------
  14. const int N=105;
  15. int n,m,p;
  16. int a[N][N],u[N][N],d[N][N],o[N][N];
  17. vector<pair<int,pii > > v;
  18. pair<int*,int> sta[3*N*N];
  19. void upd(int *x,int y) {
  20. sta[++p]=mp(x,*x);
  21. *x=y;
  22. }
  23. void back() {
  24. *sta[p].fi=sta[p].se;
  25. --p;
  26. }
  27. int main() {
  28. int T;scanf("%d",&T);
  29. while(T--) {
  30. ///
  31. scanf("%d%d",&n,&m);
  32. ///init
  33. v.clear();
  34. p=0;
  35. ///read
  36. rep(i,1,n+1) {
  37. rep(j,1,m+1) {
  38. int x;scanf("%d",&x);
  39. a[i][j]=x;
  40. v.pb(mp(x,mp(j,i)));
  41. u[i][j]=0;d[i][j]=n;o[i][j]=0;
  42. }
  43. }
  44. ///solve
  45. sort(v.begin(),v.end());
  46. ll P=0,Q=0;
  47. rep(i,1,n+1) rep(j,1,m+1) Q+=1ll*(n-i+1)*(m-j+1);
  48. for(int ci=0,cj;ci<sz(v);ci=cj) {
  49. cj=ci+1;
  50. while(cj<sz(v)&&v[ci].fi==v[cj].fi) ++cj;
  51. for(int i=ci,j,x,y,w;i<cj;i=j) {
  52. vector<int> r;
  53. j=i;y=v[i].se.fi;
  54. while(j<cj&&v[j].se.fi==y) r.pb(v[j++].se.se);
  55. ///upd up
  56. x=w=0;
  57. rep(k,0,sz(r)) {
  58. for(;w<=r[k];++w) upd(&u[w][y],x);
  59. x=r[k];
  60. }
  61. for(;w<=n;++w) upd(&u[w][y],x);
  62. ///calc
  63. rep(k,0,sz(r)) {
  64. w=r[k];
  65. int xl=u[w][y],xr=n;
  66. for(int _y=y;_y;--_y) {
  67. if(_y!=y&&o[w][_y]) break;
  68. xl=max(xl,u[w][_y]);
  69. xr=min(xr,d[w][_y]);
  70. if(xl+1>xr) break;
  71. P+=1ll*(w-xl)*(xr-w+1)*(m-y+1);
  72. }
  73. }
  74. ///upd down
  75. x=n+1;w=n;
  76. for(int k=sz(r)-1;k>=0;--k) {
  77. for(;w>=r[k];--w) upd(&d[w][y],x-1);
  78. x=r[k];
  79. }
  80. for(;w;--w) upd(&d[w][y],x-1);
  81. rep(k,0,sz(r)) upd(&o[r[k]][y],1);
  82. }
  83. while(p) back();
  84. }
  85. ///print
  86. printf("%.9f\n",1.0*P/Q);
  87. }
  88. return 0;
  89. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注