This question and a CF on the "Z" of the problem is similar to the scan line + tree-like array
Start scanning from the top right corner of the main diagonal, sweep to the lower left, each update, the right extension is equal to the point of the scan line, notice in its tree-like array update is good
Time complexity O (N^2LOGN)
#include <stdio.h>#include<iostream>#include<vector>#include<math.h>#include<Set>#include<map>#include<queue>#include<algorithm>#include<string.h>#include<string>using namespaceStd;typedefLong LongLL;ConstLL mod=1e8+7;Const intn=1e3+5;intc[2005][n],n,m;CharS[n][n];intR[n][n],xl[n][n],xr[n][n];structpoint{intx, y;}; Vector<point>g[2005];voidAddintPosintx) { for(intI=x; i<=m; i+=i& (-i))++c[pos][i];}intSumintPosintx) { intans=0; if(x==0)return 0; for(intI=x; I>0; i-=i& (-i)) ans+=C[pos][i]; returnans;}intMain () {intt,cas=0; scanf ("%d",&u); while(t--) {scanf ("%d%d",&n,&m); for(intI=1; i<=n+m; ++i) g[i].clear (); for(intI=1; i<=n; ++i) scanf ("%s", s[i]+1); Memset (XL,0,sizeof(XL)); memset (XR,0,sizeof(XR)); Memset (R,0,sizeof(R)); Memset (c,0,sizeof(c)); for(intJ=m; J>0; --j) for(intI=1; i<=n; ++i)if(s[i][j]=='x') r[i][j]=r[i][j+1]+1; for(intI=n; I>0; --i) for(intj=1; j<=m; ++j)if(s[i][j]=='x') xl[i][j]=xl[i+1][j-1]+1, xr[i][j]=xr[i+1][j+1]+1; for(intI=1; i<=n; ++i) for(intj=1; j<=m; ++j)if(s[i][j]=='x') { intx=i,y=j+r[i][j]-1; if(x<y) y-= (X-1), x=1; Elsex-= (y1), y=1; Point TMP; Tmp.x=i,tmp.y=J; intID; if(x==1) id=y; Elseid=m+x; G[id].push_back (TMP); } intres=0; for(intI=m; i>=1; --i) { for(intj=0; J<g[i].size (); ++j) {intpos=g[i][j].x+g[i][j].y; Add (POS,G[I][J].Y); } for(intx=1, Y=i; x<=n&&y<=m; ++x,++y) {if(s[x][y]!='x')Continue; intL=min (xl[x][y],xr[x][y]); Res+=sum (x+y,y)-sum (x+y,y-l); } } for(intI=2; i<=n; ++i) { for(intj=0; J<g[m+i].size (); ++j) {intpos=g[i+m][j].x+g[i+m] [J].y; Add (Pos,g[i+m] [J].Y]; } for(intx=i,y=1; x<=n&&y<=m; ++x,++y) {if(s[x][y]!='x')Continue; intL=min (xl[x][y],xr[x][y]); Res+=sum (x+y,y)-sum (x+y,y-M); }} printf ("Case #%d:%d\n",++cas,res); } return 0;}View Code
Fzu 2225 Small Tea Magic array Scan line + tree-like array