标签:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <queue> 7 #include <cmath> 8 #include <set> 9 using namespace std; 10 11 #define N 100005 12 #define ll root<<1 13 #define rr root<<1|1 14 #define mid (a[root].l+a[root].r)/2 15 16 17 int n; 18 vector<int>ve[N]; 19 20 struct Line{ 21 int h, l, r, val; 22 }b[N]; 23 24 bool cmp(Line a,Line b){ 25 return a.h<b.h; 26 } 27 28 struct node{ 29 int l, r, val; 30 bool lazy; 31 }a[N*4]; 32 33 void build(int l,int r,int root){ 34 a[root].l=l; 35 a[root].r=r; 36 a[root].lazy=false; 37 a[root].val=0; 38 if(l==r) return; 39 build(l,mid,ll); 40 build(mid+1,r,rr); 41 } 42 43 void update(int l,int r,int val,int root){ 44 if(a[root].l==l&&a[root].r==r){ 45 a[root].lazy=true; 46 a[root].val=val; 47 return; 48 } 49 if(r<=a[ll].r) update(l,r,val,ll); 50 else if(l>=a[rr].l) update(l,r,val,rr); 51 else{ 52 update(l,mid,val,ll); 53 update(mid+1,r,val,rr); 54 } 55 } 56 57 int query(int p,int root){ 58 if(a[root].l==a[root].r&&a[root].l==p){ 59 return a[root].val; 60 } 61 if(a[root].lazy){ 62 a[ll].lazy=a[rr].lazy=true; 63 a[root].lazy=false; 64 a[ll].val=a[rr].val=a[root].val; 65 } 66 if(p<=a[ll].r) return query(p,ll); 67 else return query(p,rr); 68 } 69 70 bool visited[N]; 71 int dis[N]; 72 73 void spfa(int root){ 74 queue<int>Q; 75 Q.push(root); 76 memset(visited,false,sizeof(visited)); 77 visited[root]=true; 78 for(int i=0;i<=n;i++) dis[i]=-999999999; 79 dis[root]=100+b[root].val; 80 int i, u, v; 81 while(!Q.empty()){ 82 u=Q.front();Q.pop();visited[u]=false; 83 for(i=0;i<ve[u].size();i++){ 84 v=ve[u][i]; 85 if(v&&dis[v]<dis[u]+b[v].val&&dis[u]+b[v].val>0){ 86 dis[v]=dis[u]+b[v].val; 87 if(!visited[v]){ 88 Q.push(v);visited[v]=true; 89 } 90 } 91 else if(!v&&dis[v]<dis[u]){ 92 dis[v]=dis[u]; 93 } 94 } 95 } 96 } 97 98 main() 99 { 100 int i, j, k; 101 int maxh, minh; 102 while(scanf("%d",&n)==1){ 103 maxh=-1; 104 minh=999999999; 105 for(i=1;i<=n;i++) { 106 scanf("%d %d %d %d",&b[i].h,&b[i].l,&b[i].r,&b[i].val); 107 maxh=max(maxh,b[i].r); 108 minh=min(minh,b[i].l); 109 } 110 build(minh,maxh,1); 111 sort(b+1,b+n+1,cmp); 112 for(i=0;i<=n;i++) ve[i].clear(); 113 int l, r; 114 for(i=1;i<=n;i++){ 115 l=query(b[i].l,1); 116 r=query(b[i].r,1); 117 if(l==r) ve[i].push_back(l); 118 else{ 119 ve[i].push_back(l); 120 ve[i].push_back(r); 121 } 122 update(b[i].l,b[i].r,i,1); 123 } 124 spfa(n);//n为最高木板标号,0为地面 125 if(dis[0]>0) printf("%d\n",dis[0]); 126 else printf("-1\n"); 127 } 128 }
标签:
原文地址:http://www.cnblogs.com/qq1012662902/p/4654668.html