poj1201 发表于 2018-12-16 | 分类于 题解 | 阅读数 次 链接:poj1201 题解 板子题,点上区间问题转为前缀和的点上问题,就可以建图了。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<bits/stdc++.h>#define rep(i,x,y) for(register int i=x;i<=y;++i)#define repd(i,x,y) for(register int i=x;i>=y;--i)#define ll long longconst int N=1e5+7;const int inf=0x3f3f3f3f;using namespace std;int n,m,cnt,mx,mn,nxt[N],w[N],to[N],head[N],dis[N],inq[N];inline void adde(int a,int b,int c){ w[++cnt]=c; to[cnt]=b; nxt[cnt]=head[a]; head[a]=cnt;}queue<int>q;void spfa(){ q.push(mn); inq[mn]++;dis[mn]=0; while(!q.empty()){ int k=q.front(); q.pop();inq[k]--; for(int i=head[k],v;i;i=nxt[i]){ if(dis[v=to[i]]>=dis[k]+w[i])continue; dis[v]=dis[k]+w[i]; if(!inq[v]){q.push(v);inq[v]++;} } }}int main(){ while(~scanf("%d",&n)){ mx=0;mn=inf; memset(head,0,sizeof head); memset(dis,0,sizeof dis); rep(i,1,n){ int a,b,c; scanf("%d%d%d",&a,&b,&c); mx=max(mx,b); mn=min(mn,a); adde(a-1,b,c); } rep(i,mn,mx)adde(i-1,i,0),adde(i,i-1,-1),dis[i]=-inf; spfa(); printf("%d\n",dis[mx]); } return 0;}