这个题和线段覆盖4没有本质区别,就是加了个离散化,而且这个题有双倍经验
线段覆盖5
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int n,tail; long long da[2000020],ans[1000010]; struct in { long long l,r,c; }ter[1000010]; bool cmp(in a,in b) { return a.r<b.r; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld%lld%lld",&ter[i].l,&ter[i].r,&ter[i].c); if(ter[i].l>ter[i].r) swap(ter[i].l,ter[i].r); da[++tail]=ter[i].l,da[++tail]=ter[i].r;//把所有的点都放在一个数组里面,便于离散化 } sort(da+1,da+1+tail);//先排序 tail=unique(da+1,da+1+tail)-da-1;//去重,得到数组最后一个元素下标 sort(ter+1,ter+1+n,cmp); for(int i=1;i<=n;i++)//lower_bound是二分查找第一个大于或等于指定数的数字 ter[i].l=lower_bound(da+1,da+1+tail,ter[i].l)-da,ter[i].r=lower_bound(da+1,da+1+tail,ter[i].r)-da; int pos=0,i=1; for(pos=1;i<=n;pos++)//其余和线段覆盖4无区别 { ans[pos]=ans[pos-1]; while(pos==ter[i].r&&i<=n) ans[pos]=max(ans[pos],ans[ter[i].l]+ter[i].c),i++; } printf("%lld",ans[pos-1]); }
黑心的市长
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int n,m,tail; long long da[2000020],ans[1000010]; struct in { long long l,r,c; }ter[1000010]; bool cmp(in a,in b) { return a.r<b.r; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%lld%lld%lld",&ter[i].l,&ter[i].r,&ter[i].c); if(ter[i].l>ter[i].r) swap(ter[i].l,ter[i].r); da[++tail]=ter[i].l,da[++tail]=ter[i].r;//把所有的点都放在一个数组里面,便于离散化 } sort(da+1,da+1+tail);//先排序 tail=unique(da+1,da+1+tail)-da-1;//去重,得到数组最后一个元素下标 sort(ter+1,ter+1+m,cmp); for(int i=1;i<=m;i++)//lower_bound是二分查找第一个大于或等于指定数的数字 ter[i].l=lower_bound(da+1,da+1+tail,ter[i].l)-da,ter[i].r=lower_bound(da+1,da+1+tail,ter[i].r)-da; int pos=0,i=1; for(pos=1;i<=m;pos++)//其余和线段覆盖4无区别 { ans[pos]=ans[pos-1]; while(pos==ter[i].r&&i<=m) ans[pos]=max(ans[pos],ans[ter[i].l]+ter[i].c),i++; } printf("%lld",ans[pos-1]); }