zoukankan      html  css  js  c++  java
  • [CF1453C] Triangles

    [CF1453C] Triangles - 构造

    Description

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

    Solution

    一开始读错题了,以为不能把 d 改成 d,也不知道怎么就在 allowed 前面脑补了一个 not,然后大脑炸胡……,跳去切 D 了

    这种带构造性质的东西,我们的想法是去提供一个不会比最优解更劣,同时又比较简便的方案

    我们钦定底是和坐标轴平行的,那么高也是平行的

    假设现在随便选了一个点 A 做底的一个顶点,找一个点 B 做高的顶点,然后我们去修改另一个 C 做底的另一个顶点

    这样处理起来比较简单,我们只需要记录每种颜色出现的 i,j 的最大最小值,四种情况,高就很容易算出来,而 AC 的长度是任意的,我们直接把 C 怼到边界上即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int t;
        cin >> t;
    
        while (t--)
        {
            int n;
            cin >> n;
    
            vector<vector<int>> a(n + 2, vector<int>(n + 2));
            for (int i = 1; i <= n; i++)
            {
                string str;
                cin >> str;
                for (int j = 1; j <= n; j++)
                    a[i][j] = str[j - 1] - '0';
            }
    
            vector<int> imax(11, -1), jmax(11, -1), imin(11, n + 1), jmin(11, n + 1);
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    imax[a[i][j]] = max(imax[a[i][j]], i);
                    imin[a[i][j]] = min(imin[a[i][j]], i);
                    jmax[a[i][j]] = max(jmax[a[i][j]], j);
                    jmin[a[i][j]] = min(jmin[a[i][j]], j);
                }
            }
    
            vector<int> ans(11);
    
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    if (imin[a[i][j]] <= n)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(imin[a[i][j]] - i) * (j - 1));
                    if (imin[a[i][j]] <= n)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(imin[a[i][j]] - i) * (n - j));
                    if (imax[a[i][j]] > 0)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(imax[a[i][j]] - i) * (j - 1));
                    if (imax[a[i][j]] > 0)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(imax[a[i][j]] - i) * (n - j));
                    if (jmin[a[i][j]] <= n)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(jmin[a[i][j]] - j) * (i - 1));
                    if (jmin[a[i][j]] <= n)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(jmin[a[i][j]] - j) * (n - i));
                    if (jmax[a[i][j]] > 0)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(jmax[a[i][j]] - j) * (i - 1));
                    if (jmax[a[i][j]] > 0)
                        ans[a[i][j]] = max(ans[a[i][j]], abs(jmax[a[i][j]] - j) * (n - i));
                }
            }
    
            for (int i = 0; i < 10; i++)
                cout << ans[i] << " ";
            cout << endl;
        }
    }
    
  • 相关阅读:
    Go学习2-切片
    Go学习1-MOD
    lua学习之逻辑运算符not,and,or
    google protobuf c++ 反射
    我要谴责一下,你们复制别人的答案好歹仔细看看
    远程登录redis
    openssl进行RSA加解密(C++)
    linux通过进程名查看其占用端口
    简体字丶冯|服务网关kong-docker安装
    简体字冯|docker-安装docker私有库
  • 原文地址:https://www.cnblogs.com/mollnn/p/14498395.html
Copyright © 2011-2022 走看看