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;
        }
    }
    
  • 相关阅读:
    福大软工1816 · 第三次作业
    福大软工1816 · 第二次作业
    2018福大软工第一次作业
    20180823-软工实践第一次作业-自我介绍
    福大软工1816 · 第一次作业
    开博之作 · 简单的自我介绍
    2018软件工程实践第一次作业
    系列最终篇!
    含继承多态思想的四则运算器和简单工厂模式初步
    作业六 栈的使用和界面编程探索
  • 原文地址:https://www.cnblogs.com/mollnn/p/14498395.html
Copyright © 2011-2022 走看看