萌新求调,RE*22,玄关
查看原帖
萌新求调,RE*22,玄关
1235008
fanminghao000楼主2025/6/16 17:46
#include <bits/stdc++.h>
#ifndef DEBUG
#define debug(x)
#endif
using namespace std;

int cnt[800010];
vector<int> vis;//桶记录前缀和为0的子区间
int main() {
  cin.tie(0)->sync_with_stdio(0);
  int T;cin>>T;
  while(T--){
    int n,m;cin>>n>>m;
    vector<vector<int>> a(n+1,vector<int>(m+1,0));
    for(int i=1;i<=n;i++){
      string s;cin>>s;
      for(int j=1;j<=m;j++){
        if(s[j-1]=='#') a[i][j]=1;
        else a[i][j]=-1;
      }
    }
    if(n>m){
      vector<vector<int>> b(n+1,vector<int>(m+1,0));
      b=a;
      a.resize(m+1,vector<int>(n+1,0));
      for(int i=1;i<=m;i++){
          for(int j=1;j<=n;j++) 
              a[i][j]=b[j][i];
      swap(n,m);
    }//rotate
    vector<vector<int>> sum(n+1,vector<int>(m+1,0));
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++) sum[i][j]=sum[i-1][j]+a[i][j];
    long long ans=0;
    for(int u=1;u<=n;u++){
      for(int d=u;d<=n;d++){
        vis.clear();
        int now=0;
        cnt[400000]=1;
        for(int i=1;i<=m;i++){
          now+=(sum[d][i]-sum[u-1][i]);
          ans+=cnt[now+400000];
          cnt[now+400000]++;
          vis.push_back(now+400000);
        }
        for(auto x:vis) cnt[x]=0;
      }
    }
    cout<<ans<<endl;
  }
  return 0;
}

有22个点RE

并且,如果去掉旋转那一段代码,就没有RE了,只剩三个TLE,所以我觉得只能是旋转那一段有问题(不排除这一段导致其他地方有问题)

2025/6/16 17:46
加载中...