整数区间

原题链接

题解

1.设 f(i)[0,i] 区间内该有多少个数属于整数集 Z
则对于每一对输入的 x,y,c 都有 f[y]f[x1]>=c 而且 0<=f[i]f[i1]<=1 差分约束由此得来
又因为下标从零开始,而且我们需要建立超级源点,所以我们把 f 内的下标整体往右移两位

code

#include<bits/stdc++.h>
using namespace std;
int dis[500005]={0};
int in_q[500005]={0};
struct node
{
    int to,val;
};
vector<node> G[500005];
int main()
{

    int n;
    while(cin>>n)
    {
        for(int i=0;i<=50005;i++) G[i].clear();

    for(int i=1;i<=n;i++)
    {
        int x,y,c;
        cin>>x>>y>>c;
        G[x+1].push_back(node{y+2,c});
    }

    for(int i=1;i<=50005;i++)
    {
        G[0].push_back(node{i,0});
        G[i].push_back(node{i+1,0});
        G[i+1].push_back(node{i,-1});
    }

    for(int i=1;i<=50005;i++) dis[i]=-2e9;
    memset(in_q,0,sizeof in_q);
    queue<int> q;
    q.push(0);
    in_q[0]=1;
    dis[0]=0;
    while(q.size())
    {
        int now=q.front();
        q.pop();
        in_q[now]=0;
        for(auto next:G[now])
        {
            int to=next.to,val=next.val;
            if(val+dis[now]>dis[to])
            {
                dis[to]=val+dis[now];
                if(!in_q[to])
                {
                    q.push(to);
                    in_q[to]=1;
                }
            }
        }
    }

    int ans=0;
    for(int i=0;i<=50005;i++)
    {
        //if(i<20) printf("%d:%d\n",i-2,dis[i]);
        ans=max(ans,dis[i]-dis[1]);
    }
    cout<<ans<<endl;
    }

    return 0;
}

posted @   纯粹的  阅读(31)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示