首页 > 其他分享 >[ARC104C] Fair Elevator 题解

[ARC104C] Fair Elevator 题解

时间:2023-11-02 21:46:17浏览次数:37  
标签:std ARC104C false 题解 valueType len exist Elevator 区间

题意

有 \(N\) 个区间 \([a_i,b_i](a_i<b_i)\),都是 \([1,2n]\) 内的整数且互不相同(\(a_i\ne b_j,a_i\ne a_j,b_i\ne b_j\))。

现在给定一些 \(a\) 和 \(b\) 的值,剩下不知道的用 \(-1\) 表示。问是否存在一种替换掉 \(-1\) 的方案,使得:若两个区间有交,那么它们长度相等

即 \(\forall i,j,[a_i,b_i]\cap[a_j,b_j]\ne \varnothing\Rightarrow b_i-a_i=b_j-a_j\)。

\(N\le 100\)。

题解

首先特判掉一些一定无解的情况,例如 \(\exist i \neq j, a_i = a_j\),\(a_i \ge b_i\) 等等。

可以发现若存在区间 \([l, r]\),设 \(L = r - l\),那么对于任意 \(l \ge i < r\),一定有区间 \([i, i + L]\) 存在。即整个区间 \([l, r + L - 1]\) 内的子区间内的元素都会被钦定值并且合法。

可以发现考察一个区间 \([l, r]\) 能否合法存在的复杂度为 \(\mathcal{O}(N)\) 的。由于 \(N\) 很小,故我们可以以 \(\mathcal{O}(N^3)\) 处理出所有可以被钦定合法的区间。

根据上述分析,可以发现被钦定合法的区间一定补交,因此若一个区间没有被钦定合法,我们可以枚举其中的一个断点并判断左右两个区间是否可以合法,进而实现转移,复杂度为 \(\mathcal{O}(N^3)\)。

Code

#include <bits/stdc++.h>

typedef int valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<bool> bitset;
typedef std::vector<bitset> BitMatrix;

bool check(valueType N, ValueVector A, ValueVector B) {
    bitset exist(2 * N + 1, false);

    for (valueType i = 1; i <= N; ++i) {
        if (A[i] != -1 && B[i] != -1 && A[i] >= B[i])
            return false;

        if (A[i] != -1) {
            if (exist[A[i]])
                return false;

            exist[A[i]] = true;
        }

        if (B[i] != -1) {
            if (exist[B[i]])
                return false;

            exist[B[i]] = true;
        }
    }

    return true;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType N;

    std::cin >> N;

    valueType const M = 2 * N;

    ValueVector A(N + 1), B(N + 1);

    for (valueType i = 1; i <= N; ++i)
        std::cin >> A[i] >> B[i];

    if (!check(N, A, B)) {
        std::cout << "No" << std::endl;

        return 0;
    }

    ValueVector left(M + 1, -1), right(M + 1, -1), belong(M + 1, -1);
    bitset exist(M + 1, false);

    for (valueType i = 1; i <= N; ++i) {
        if (A[i] != -1) {
            right[A[i]] = B[i];
            exist[A[i]] = true;
            belong[A[i]] = i;
        }

        if (B[i] != -1) {
            left[B[i]] = A[i];
            exist[B[i]] = true;
            belong[B[i]] = i;
        }
    }

    BitMatrix F(M + 1, bitset(M + 1, false));

    for (valueType l = 1; l <= M; ++l) {
        for (valueType r = l + 1; r <= M; ++r) {
            valueType len = r - l;

            if (r + len - 1 > M)
                continue;

            bool ok = true;

            for (valueType i = l; i < r && ok; ++i) {
                if (right[i] != -1 && right[i] != i + len)
                    ok = false;

                if (left[i + len] != -1 && left[i + len] != i)
                    ok = false;

                if (exist[i] && exist[i + len] && belong[i] != belong[i + len])
                    ok = false;
            }

            if (ok)
                F[l][r + len - 1] = true;
        }
    }

    for (valueType len = 1; len <= M; ++len) {
        for (valueType l = 1; l + len <= M; ++l) {
            valueType const r = l + len;

            for (valueType mid = l + 1; mid < r; ++mid) {
                if (F[l][mid] && F[mid + 1][r]) {
                    F[l][r] = true;

                    break;
                }
            }
        }
    }

    if (F[1][M])
        std::cout << "Yes" << std::endl;
    else
        std::cout << "No" << std::endl;
}

标签:std,ARC104C,false,题解,valueType,len,exist,Elevator,区间
From: https://www.cnblogs.com/User-Unauthorized/p/solution-ARC104C.html

相关文章

  • 题解:USACO23OPEN-Silver
    题解:USACO23OPEN-SilverT1MilkSum给定一个长度为\(N\)的序列\(a_1,a_2,...,a_n\),现在给出\(Q\)次操作每次将\(a_x\)修改为\(y\),每次修改后,求将序列重排后的\(T\)的最大值,定义\(T=\sum_{i=1}^{n}i\timesa_i)\)每次修改数组后会将序列还原成原样(修改不继承)有一......
  • CF773A Success Rate 题解
    SuccessRate(提供二分做法)前言听说是史上最简单蓝题,做了一下。题意已知\(x,y,p,q\),通过只让\(y\)加\(1\)或\(x,y\)同时加\(1\),使得满足:\[\frac{x'}{y'}=\frac{p}{q}\]思考目标状态为\(\frac{p}{q}\),考虑到这是个比值,自然\(\frac{x'}{y'}=\frac{kp}{kp}\)。明显......
  • 【POJ 1256】Anagram 题解(全排列)
    描述你要编写一个程序,从一组给定的字母中生成所有可能的单词。示例:给定单词“abc”,您的程序应该-通过探索这三个字母的所有不同组合-输出单词“abc”、“acb”、“bac”、“bca”、“cab”和“cba”。在输入文件中的单词中,某些字母可能出现多次。对于给定的单词,您的程序不应多次......
  • CF1868B2 Candy Party (Hard Version) 题解
    Problem-1868B2-CodeforcesCandyParty(HardVersion)-洛谷相信大家已经看过SimpleVersion,这题和上题不同之处就在于如果\(b_i=2^x\),他可以被分解成\(2^x\)或\(2^{x+1}-2^x\),我们不妨起初固定一种方案,如果不满足条件后再把一部分换回去。我们强制钦定起......
  • CF227A Where do I Turn? 题解
    题目大意:\(A\),\(B\)在一条直线上。\(B\),\(C\)在一条直线上你从\(A\)走到了\(B\)去\(C\),问现在应该是直走、左转、还是右转。思路:分类讨论:分别求\(A\)到\(B\),\(B\)到\(C\)是什么方向,然后可得\(A\)到\(C\)的方向。Code:#include<bits/stdc++.h>usingnamesp......
  • CF333B题解
    分析发现只能跳\(n-1\)次,所以每个点一定是畅通无阻地抵达终点,所以有障碍的行和列放不了,并且每一个行或列最多放一个。因为同时跳,思考会不会跳到一起,发现如果不在正中间可以将起点放到另一头就不会跳到一起,如果在正中间就一定会跳到一起,所以正中间的行和列加一起最多只能放......
  • CF333A题解
    分析被除数一定,除数越小,商越大,所以选择合法的最小\(3_{x}\)。枚举指数即可,复杂度\(\mathcal{O(\log_{3}w)}\),\(w\)为值域\(1e18\),可以通过本题。代码#include<iostream>#defineintlonglongusingnamespacestd;constexprintMAXN(1000007);intf[MAXN];int......
  • P9740 「KDOI-06-J」ION 比赛 题解
    题目思路:先计算总分数\(sum\),\(c_i=\frac{100}{a_i}\)为每道题的每个测试点分数。如果总分数达到\(Au\)线,直接输出AlreadyAu.。否则计算到达\(Au\)线还需多少分\(p\),遍历所有题,求出每道题的失分,如果失分大于等于\(p\),则输出\(\lceil\frac{p}{c_i}\rceil\),即至......
  • Educational Codeforces Round 134 (Div.2) D 题解
    题目链接D.MaximumAND题目大意给定两组序列\(a\)\(b\),长度为\(n\),现有一新序列\(c\),长度也为\(n\)。其中,\(c_i=a_i\oplusb_i\)。定义\(f(a,b)=c_1\&c_2\&……\&c_n\)。现在你可以随意编排\(b\)序列的顺序,求\(f(a,b)\)的最大值。思路以下位运算均是......
  • 【python】-bash: /usr/local/bin/pip: /usr/bin/python: bad interpreter: No such f
    安装单独的第三方库时没有问题pipinstallpandas但是一旦使用requirement.txt批量安装第三方库时就会出现-bash:/recorddata/rebuydata/hppy/soft/python3/bin/pip3:/usr/local/source/hppy/soft/python3/bin/python3.6:badinterpreter:没有那个文件或目录badinterpreter......