CodeForces 1453 C. Triangles

CodeForces 1453 C. Triangles

题目大意:

给一个矩阵,每个元素都是 1 − 9 1-919,对每个 d dd,选三点都是 d dd 的,问组成最大的三角形面积多大,每个 d dd ,都可以把一个数字改成 d dd,然后算完在改回去。d dd1 − 9 1 - 919 遍历的

思路:

记录每个数字的最大行最小行,最大列和最小列。然后枚举每个位置,用刚记录的算,具体看代码理解

代码:

#include <bits/stdc++.h>
using namespace std;
#define me(a, b) memset(a, b, sizeof(a))
#define IOS() ios::sync_with_stdio(false), cin.tie(0)
#define endl '\n'

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 2e3 + 5;
const ll mod = 1e9 + 7;

char s[maxn][maxn];

void solve()
{
    int ans[10] = {0};
    int maxr[10] = {0}, minr[10];
    int maxc[10] = {0}, minc[10];
    for(int i = 0; i < 10; ++i)
        minr[i] = minc[i] = INF;
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i) {
        cin >> s[i]+1;
        for(int j = 1; j <= n; ++j) {
            int x = s[i][j] - '0';
            maxr[x] = max(maxr[x], i), minr[x] = min(minr[x], i);
            maxc[x] = max(maxc[x], j), minc[x] = min(minc[x], j);
        }
    }
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            int x = s[i][j] - '0';
            ans[x] = max(ans[x], max(i-minr[x], maxr[x]-i) * max(n-j, j-1));
            ans[x] = max(ans[x], max(j-minc[x], maxc[x]-j) * max(n-i, i-1));
        }
    }
    for(int i = 0; i < 10; ++i)
        cout << ans[i] << " ";
    cout << endl;
}

int main()
{
    IOS();
    int T;
    cin >> T;
    while(T--)
        solve();
    
    
    return 0;
}

总结:

没想出来,头皮都抠破了,烦躁,还是看官方题解补的,太菜了


版权声明:本文为weixin_43313475原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。