zoukankan      html  css  js  c++  java
  • [ICPC2020昆明L] Simone and graph coloring

    [ICPC2020昆明L] Simone and graph coloring - 线段树

    Description

    给定长度为 (n) 的排列,有一个 (n) 个顶点的图,按照以下方式建图:如果图中存在逆序对 ((i,j)),那么点 (i) 和点 (j) 之间连边。现在要对图染色,要求相邻点颜色不同,问最少需要多少种颜色,输出染色方案。

    Solution

    按值从大到小扫描,取前面位置所有已经填入的颜色的 MEX,容易发现可以将 MEX 换成 max,于是线段树维护即可

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1000005;
    
    int n, p[N], inv[N], val[N * 4], f[N];
    
    void read(int &n)
    {
        scanf("%d", &n);
    }
    
    void pushup(int p)
    {
        val[p] = max(val[p * 2], val[p * 2 + 1]);
    }
    
    void modify(int p, int l, int r, int pos, int key)
    {
        if (l == r)
        {
            val[p] = key;
        }
        else
        {
            if (pos <= (l + r) / 2)
                modify(p * 2, l, (l + r) / 2, pos, key);
            else
                modify(p * 2 + 1, (l + r) / 2 + 1, r, pos, key);
            pushup(p);
        }
    }
    
    int query(int p, int l, int r, int ql, int qr)
    {
        if (l > qr || r < ql)
            return 0;
        if (l >= ql && r <= qr)
            return val[p];
        return max(query(p * 2, l, (l + r) / 2, ql, qr), query(p * 2 + 1, (l + r) / 2 + 1, r, ql, qr));
    }
    
    void solve()
    {
        read(n);
        for (int i = 1; i <= n; i++)
            read(p[i]), inv[p[i]] = i;
        for (int i = n; i >= 1; i--)
        {
            int pos = inv[i];
            f[pos] = query(1, 1, n, 1, pos) + 1;
            modify(1, 1, n, pos, f[pos]);
        }
        printf("%d
    ", query(1, 1, n, 1, n));
        for (int i = 1; i <= n; i++)
            printf("%d ", f[i]);
        printf("
    ");
        for (int i = 0; i <= n; i++)
        {
            p[i] = inv[i] = f[i] = 0;
        }
        for (int i = 0; i <= 4 * n; i++)
            val[i] = 0;
    }
    
    signed main()
    {
        int t;
        read(t);
        while (t--)
            solve();
    }
    
  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/mollnn/p/14622875.html
Copyright © 2011-2022 走看看