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
上一篇: C语言-《通讯录》
下一篇: Qt使用QWT绘制柱状图详解