Descriptionios
Inputapp
Outputspa
Sample Inputcode
5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1
Sample Outputblog
6
給定n個閉區間[ai,bi](1≤i≤n,0≤ai≤bi≤50000) 和n個整數ci(1≤i≤n)
你須要在數軸上選出儘量少的點,知足每一個區間[ai,bi]中,至少有ci個數被選中了。
//差分約束系統 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; #define INF 1044266558 struct edge{ int v,w,next; }e[150006]; int dis[50006],head[50006],in[50006],ans=0; int l=INF,r=0,n; void add_edge(int u,int v,int w){ e[ans].v=v; e[ans].w=w; e[ans].next=head[u]; head[u]=ans++; } void bfs(){ queue<int>q; q.push(l); memset(dis,-1,sizeof(dis)); dis[l]=0; while(!q.empty()){ int u=q.front(); q.pop(); in[u]=0; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].v; if(dis[v]<dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; if(!in[v]){ in[v]=1; q.push(v); } } } } } int main(){ scanf("%d",&n); memset(head,-1,sizeof(head)); for(int i=0;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add_edge(u,v+1,w); l=min(l,u); r=max(r,v+1); } for(int i=l;i<r;i++){ add_edge(i,i+1,0); add_edge(i+1,i,-1); } bfs(); printf("%d\n",dis[r]); return 0; }