洛谷1645 序列
差分约束裸题。
l-1向r连c的边,i向i+1连0的边,还有i+1向i连-1的边。
//Twenty #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<vector> #include<cmath> #include<queue> typedef long long LL; using namespace std; const int maxn=1005; int ans,n,l,r,x; namespace fastIO { const int sz=1<<15|1; char buf[sz],ch,*l,*r; void gechar(char &c) { if(l==r) r=(l=buf)+fread(buf,1,sz,stdin); c = l==r?(char)EOF:*l++; } template<typename T> void read(T &x) { int f=1; x=0; gechar(ch); while(ch!='-'&&(ch<'0'||ch>'9')) gechar(ch); if(ch=='-') f=-1,gechar(ch); for(;ch>='0'&&ch<='9';gechar(ch)) x=x*10+ch-'0'; x*=f; } } int ecnt,fir[maxn],nxt[maxn<<2],to[maxn<<2],val[maxn<<2]; void add(int u,int v,int w) { nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w; //nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u; val[ecnt]=w; } void init() { fastIO::read(n); for(int i=0;i<1001;i++) add(i,i+1,0),add(i+1,i,1); for(int i=1;i<=n;i++) { fastIO::read(l); l++; fastIO::read(r); r++; fastIO::read(x); add(l-1,r,-x); } } int vis[maxn],dis[maxn]; queue<int>que; int spfa(int s) { memset(dis,127,sizeof(dis)); dis[s]=0; que.push(s); while(!que.empty()) { x=que.front(); que.pop(); vis[x]=0; for(int i=fir[x];i;i=nxt[i]) { if(dis[to[i]]>dis[x]+val[i]) { dis[to[i]]=dis[x]+val[i]; if(!vis[to[i]]) { vis[to[i]]=1; que.push(to[i]); } } } } return -dis[1001]; } void work() { ans=spfa(0); printf("%d\n",ans); } //#define DEBUG int main() { #ifdef DEBUG freopen("1.in","r",stdin); #endif init(); work(); return 0; }