Beauty of the mountains

Beauty of the mountains

尼基塔喜欢山,终于决定去贝里安德山脉看看!这座山脉如此美丽,尼基塔决定用地图记录下来。地图是一个由 $n$行和 $m$ 列组成的表格,每个单元格都包含一个非负整数,代表山的高度。

他还注意到,山有两种类型:

  • 有雪盖。
  • 无雪帽。

尼基塔是一个非常务实的人。他希望有雪帽的山的高度总和等于没有雪帽的山的高度总和。他已经和贝里安德的市长波利卡普-波利卡波维奇达成了协议,允许他改造地貌。

尼基塔可以对大小为 $k \times k$ 的子矩阵进行如下变换:他可以在该区域内的山峰高度上添加一个整数常数 $c$ ,但山峰的类型保持不变。尼基塔可以为每次变换独立选择常数 $c$ 。注意 $c$ 可以是负值

在进行变换之前,尼基塔会要求您找出是否有可能实现总和相等,或者是否不可能。代价是什么并不重要,即使山变成了峡谷,高度是负数也没关系。

如果地图上只有一种类型的山,那么另一种类型的山的高度之和将被视为零。

void solve() {
    int n,m,k;
    cin >> n >> m >> k;
    int a[n+1][m+1];
    bool tp[n+1][m+1];
    _rep(i,1,n) {
        _rep(j,1,m) {
            cin >> a[i][j];
        }
    }
    _rep(i,1,n) {
        string s;
        cin >> s;
        _rep(j,1,m) {
            tp[i][j] = (s[j-1] == '0' ? false : true);
        }
    }
    int s1[n+1][m+1],s0[n+1][m+1];
    memset(s1,0,sizeof(s1));
    memset(s0,0,sizeof(s0));
    _rep(i,1,n) {
        _rep(j,1,m) {
            s1[i][j] = s1[i-1][j] + s1[i][j-1] - s1[i-1][j-1] + tp[i][j];
            s0[i][j] = s0[i-1][j] + s0[i][j-1] - s0[i-1][j-1] + (tp[i][j] ? 0 : 1);
        }
    }
    int cnt1 = 0,cnt0 = 0;
    _rep(i,1,n) {
        _rep(j,1,m) {
            if(tp[i][j]) {
                cnt1 += a[i][j];
            } else {
                cnt0 += a[i][j];
            }
        }
    }
    if(cnt1 == cnt0) {
        cout<<"YES"<<endl;
        return;
    } 
    int dis = abs(cnt1-cnt0);
    bool ok = false;
    int ggcd = 0;
    _rep(i,k,n) {
        _rep(j,k,m) {
            int cal1 = s1[i][j] - s1[i-k][j] - s1[i][j-k] + s1[i-k][j-k];
            int cal0 = s0[i][j] - s0[i-k][j] - s0[i][j-k] + s0[i-k][j-k];
            int cnt = abs(cal1-cal0);
            if(cnt) {
                ggcd = gcd(ggcd,cnt);
            } 
        }
    }
    if(ggcd && dis%ggcd == 0) cout<<"YES";
    else cout<<"NO";
    cout<<endl;
}
github