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();
    }
    
  • 相关阅读:
    一个完整的AjaxPro例子(转)
    sql2000存储过程
    System.Configuration命名空间下找不到ConfigurationManager类
    编译器错误信息: CS0016
    (转)AjaxPro使用说明
    数据库中去逗号的函数
    asp.net 验证码
    sql2005存储过程
    简单控件分页
    身份证号码验证
  • 原文地址:https://www.cnblogs.com/mollnn/p/14622875.html
Copyright © 2011-2022 走看看