10pts悬关求助

P2363 马农

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


|