欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HDU 1384 查分约束

程序员文章站 2022-03-03 09:13:29
题意:给了n个区间,要求每个区间至少有c个数字出现,问满足的最小的数字个数 思路:用si代表0到i的区间内的数字个数,然后可以写出查分约束方程,对于一个区间则sa-s(b-1)>=c的,然后隐...

题意:给了n个区间,要求每个区间至少有c个数字出现,问满足的最小的数字个数

思路:用si代表0到i的区间内的数字个数,然后可以写出查分约束方程,对于一个区间则sa-s(b-1)>=c的,然后隐含的一个条件就是si-s(i-1)>=0且<=1的,然后泡个最长路就行,对于查分约束求最大值是<=的形式,而求最小值则是>=的形式

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3fll;
const int maxn=50010;
int dis[maxn],head[maxn],n,k;
bool vis[maxn];
struct edge{
    int to,w,next;
}e[maxn*10];
void add_edge(int u,int v,int w){
    e[k].to=v;e[k].w=w;e[k].next=head[u];head[u]=k++;
}
void spfa(int s){
    queueque;
    memset(dis,-inf,sizeof(dis));
    memset(vis,0,sizeof(vis));
    que.push(s);dis[s]=0;
    while(!que.empty()){
        int t=que.front();que.pop();
        vis[t]=0;
        for(int i=head[t];i!=-1;i=e[i].next){
            if(dis[t]+e[i].w>dis[e[i].to]){
                dis[e[i].to]=dis[t]+e[i].w;
                if(!vis[e[i].to]){
                    vis[e[i].to]=1;
                    que.push(e[i].to);
                }
            }
        }
    }
}
int main(){
    int u,v,c;
    while(scanf("%d",&n)!=-1){
        k=0;
        memset(head,-1,sizeof(head));
        int s=inf,t=-inf;
        for(int i=0;i