zoukankan      html  css  js  c++  java
  • AcWing 362. 区间

    题目描述

    给定(n)个区间([a_i,b_i])(n)个整数(c_i)
    你需要构造一个整数集合(Z),使得(∀i∈[1,n]),(Z)中满足(a_i≤x≤b_i)的整数(x)不少于(c_i)个。
    求这样的整数集合(Z)最少包含多少个数。
    输入格式
    第一行包含整数(n)
    接下来(n)行,每行包含三个整数(a_i,b_i,c_i)
    输出格式
    输出一个整数表示结果。
    数据范围
    (1leq n leq50000)
    (leq a_i,b_ileq50000)
    (1leq c_i leq b_i−a_i+1)
    输入样例

    5
    3 7 3
    8 10 3
    6 8 1
    1 3 1
    10 11 1
    

    输出样例

    6
    

    题目思路
    利用前缀的思路,(s[i])表示(1-i)中被选出树的个数。并且每个(s_i)需要满足以下条件

    • (s_i geq s_{i-1})
    • (s_i - s_{i-1} <= 1)表示第i这个元素选了多少个
    • (s_b - s_{ a-1}geq c)

    实现代码

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    
    using namespace std;
    
    const int N = 50010, M = 150010;
    
    int n;
    int h[N], e[M], ne[M], w[M], idx;
    int dist[N];
    int q[N];
    bool st[N];
    
    void add(int a,int b,int c)
    {
        e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
    }
    
    void spfa()
    {
        memset(dist,-0x3f,sizeof dist);
        dist[0] = 0;
        st[0] = true;
        int hh = 0, tt = 1;
        q[0] = 0;
    
        while(hh != tt)
        {
            int t = q[hh ++];
            st[t] = false;
    
            if(hh == N) hh = 0;
            for(int i = h[t];~i;i = ne[i])
            {
                int j = e[i];
                if(dist[j] < dist[t] + w[i])
                {
                    dist[j] = dist[t] + w[i];
                    if(!st[j])
                    {
                        q[ tt ++] = j;
                        if(tt == N) tt = 0;
                        st[j] = true;
                    }
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d",&n);
        memset(h,-1,sizeof h);
         for (int i = 1; i < N; i ++ )
        {
            add(i - 1, i, 0);
            add(i, i - 1, -1);
        }
        for(int i = 0;i < n;i ++)
        {
            int a, b, c;
            scanf("%d%d%d",&a,&b,&c);
            a = a + 1, b = b + 1;
            add(a - 1, b, c);
        }
    
        spfa();
        printf("%d",dist[50001]);
        return 0;
    }
    
  • 相关阅读:
    ubuntu 14.04 如何安装nvidia显卡驱动 [转载]
    torch Tensor学习:切片操作
    Graphviz(转载)
    torch 深度学习(5)
    torch 深度学习(4)
    torch 深度学习(3)
    torch 深度学习 (2)
    C# 初识Ref和Out
    Unity发送短信
    Unity 3D 动画帧事件
  • 原文地址:https://www.cnblogs.com/zykBlog/p/13860595.html
Copyright © 2011-2022 走看看