模拟+分类大讨论——cf

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟+分类大讨论——cf相关的知识,希望对你有一定的参考价值。

 显然,三元组前两位确定后,第三位最多只有两种情况

答案只有111,112,121,211,122,212,221,123,132,213,231,312,321

分别讨论下存不存在就行

感觉题解的讨论方法不错,自己的写了(复制了)两百多行。。

#include <bits/stdc++.h>
#define F(i,a,b) for ( int i = (int)(a); i < (int)(b); ++i )
#define ff first
#define ss second
using namespace std;
using ii = pair<int,int>;
using vi = vector<int>;

const int INF = 1e9+7;

int main() {
    ios::sync_with_stdio(0);
    int    n;
    cin >> n;
    vi a(n);
    F(i,0,n)
        cin >> a[i];

    set<int> res, active;
    multiset<int> L, R;
    map<int,int> leftmost, rightmost;
    F(i,0,n) {
        int x = a[i];
        R.insert(x);
        if (!leftmost.count(x))
            leftmost[x] = i;
        rightmost[x] = i;
    }
    F(i,0,n) {
        int x = a[i];
        R.erase(R.find(x));
        if (leftmost[x] == i)
            active.insert(x);
        if (rightmost[x] == i)
            active.erase(x);
        if (active.size() && *active.begin() < x)
            res.insert(121);
        if (active.size() && *active.rbegin() > x)
            res.insert(212);
        
        bool onLeft = L.find(x) != L.end();
        bool onRight = R.find(x) != R.end();
        auto Lmin  = L.size() ? *L.begin() : 0;
        auto Lless = L.lower_bound(x) == L.begin() ? 0 : *--L.lower_bound(x);
        auto Lmore = L.upper_bound(x) == L.end() ? 0 : *L.upper_bound(x);
        auto Lmax  = L.size() ? *L.rbegin() : 0;
        auto Rmin  = R.size() ? *R.begin() : 0;
        auto Rless = R.lower_bound(x) == R.begin() ? 0 : *--R.lower_bound(x);
        auto Rmore = R.upper_bound(x) == R.end() ? 0 : *R.upper_bound(x);
        auto Rmax  = R.size() ? *R.rbegin() : 0;
        
        if (onLeft && onRight)
            res.insert(111);
        if (onLeft && Rmax && Rmax > x)
            res.insert(112);
        if (Lmin && Lmin < x && onRight)
            res.insert(122);
        if (Lmax && Lmax > x && onRight)
            res.insert(211);
        if (Rmin && Rmin < x && onLeft)
            res.insert(221);
        if (Lmin && Rmax && Lmin < x && Rmax > x)
            res.insert(123);

        if (Lmin && Rless && Lmin < Rless && Rless < x)
            res.insert(132);
        if (Lmore && Rmax && Lmore > x && Lmore < Rmax)
            res.insert(213);
        if (Lless && Rmin && Lless < x && Lless > Rmin)
            res.insert(231);
        if (Lmax && Rmore && Lmax > Rmore && Rmore > x)
            res.insert(312);
        if (Lmax && Rless && Lmax > x && x > Rless)
            res.insert(321);
        L.insert(x);
    }
    for (auto t : res) {
        cout << t << endl;
    }
    return 0;
}

 

以上是关于模拟+分类大讨论——cf的主要内容,如果未能解决你的问题,请参考以下文章

[CF1216C] White Sheet - 离散化,模拟

cf 模拟

CF870FPaths 分类讨论+数学

CF746 C 分类讨论 水题

CF 1003B Binary String Constructing 构造/找规律/分类讨论

CF1042C Array Product 分类讨论+贪心