WsW_ @ 2024-08-01 23:52:04
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
int n;
map<ll,int>cnt;
ll mp[55][55];
ll ans;
ll query(int lx,int ly,int rx,int ry){
return mp[rx][ry]-mp[lx-1][ry]-mp[rx][ly-1]+mp[lx-1][ly-1];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
mp[i][j]+=mp[i][j-1]+mp[i-1][j]-mp[i-1][j-1];
}
}
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
for(int lx=1;lx<=i;lx++){
for(int ly=1;ly<=i;ly++){
cnt[query(lx,ly,i,j)]++;
}
}
for(int rx=i+1;rx<=n;rx++){
for(int ry=j+1;ry<=n;ry++){
ans+=cnt[query(i+1,j+1,rx,ry)];
}
}
cnt.clear();
for(int lx=1;lx<=i;lx++){
for(int ry=j+1;ry<=n;ry++){
cnt[query(lx,j+1,i,ry)]++;
}
}
for(int rx=i+1;rx<=n;rx++){
for(int ly=1;ly<=i;ly++){
ans+=cnt[query(i+1,ly,rx,j)];
}
}
cnt.clear();
}
}
cout<<ans;
return 0;
}
by JOKER_chu @ 2024-08-02 00:40:33
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
int n;
map<ll,int>cnt;
ll mp[55][55];
ll ans;
ll query(int lx,int ly,int rx,int ry){
return mp[rx][ry]-mp[lx-1][ry]-mp[rx][ly-1]+mp[lx-1][ly-1];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
mp[i][j]+=mp[i][j-1]+mp[i-1][j]-mp[i-1][j-1];
}
}
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
for(int lx=1;lx<=i;lx++){
for(int ly=1;ly<=j;ly++){
cnt[query(lx,ly,i,j)]++;
}
}
for(int rx=i+1;rx<=n;rx++){
for(int ry=j+1;ry<=n;ry++){
ans+=cnt[query(i+1,j+1,rx,ry)];
}
}
cnt.clear();
for(int lx=1;lx<=i;lx++){
for(int ry=j+1;ry<=n;ry++){
cnt[query(lx,j+1,i,ry)]++;
}
}
for(int rx=i+1;rx<=n;rx++){
for(int ly=1;ly<=j;ly++){
ans+=cnt[query(i+1,ly,rx,j)];
}
}
cnt.clear();
}
}
cout<<ans;
return 0;
}
你的循环下标边界似乎搞混了
for(int rx=i+1;rx<=n;rx++){
for(int ly=1;ly<=i;ly++){
ans+=cnt[query(i+1,ly,rx,j)];
}
}
应为
for(int rx=i+1;rx<=n;rx++){
for(int ly=1;ly<=j;ly++){
ans+=cnt[query(i+1,ly,rx,j)];
}
}
for(int lx=1;lx<=i;lx++){
for(int ly=1;ly<=i;ly++){
cnt[query(lx,ly,i,j)]++;
}
}
应为
for(int lx=1;lx<=i;lx++){
for(int ly=1;ly<=j;ly++){
cnt[query(lx,ly,i,j)]++;
}
}
by JOKER_chu @ 2024-08-02 00:40:53
@WsW_
by WsW_ @ 2024-08-02 09:15:47
@chuxm thx