1 条题解
-
0
思路
前缀选点数约束相邻增量0或1及区间下界,所有点被选是可行势p[i]=i;把最长路约束重标成非负边求最短路再还原最少选点数,避免错误开区间或漏坐标0。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;const int V=50001;vector<vector<pair<int,int>>>g(V+1);for(int i=0;i<V;i++){g[i].push_back({i+1,1});g[i+1].push_back({i,0});}while(n--){int a,b,c;cin>>a>>b>>c;g[a].push_back({b+1,b+1-a-c});}vector<int>d(V+1,1000000000);priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;d[0]=0;q.push({0,0});while(!q.empty()){auto p=q.top();q.pop();int v=p.second;if(p.first!=d[v])continue;if(v==V)break;for(auto e:g[v])if(d[e.first]>d[v]+e.second){d[e.first]=d[v]+e.second;q.push({d[e.first],e.first});}}cout<<V-d[V]<<'\n';}
- 1