1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<map> #include<set> #include<queue> #include<deque> #include<stack> #include<bitset> #include<vector> #include<algorithm> #include<iostream> using namespace std; #ifdef DEBUG const int LOCAL=1; #else const int LOCAL=0; #endif
namespace mine { typedef long long ll; const int INF=0x3f3f3f3f; int () { int ans=0;char c=getchar(); while(c<'0' or c>'9') c=getchar(); while(c>='0' and c<='9') ans=ans*10+c-'0',c=getchar(); return ans; } void qwrite(ll num) { if(num>=10) qwrite(num/10); putchar('0'+num%10); } void qwriteln(ll num) {qwrite(num);puts("");}
const int MAX_N=110000; struct Data { int lst,ln; friend bool operator < (Data a,Data b) {return a.lst<b.lst;} }; set<Data> p[MAX_N]; void main() { int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i].insert((Data){-1,0}); int ans=0; for(int i=1;i<=m;i++) { int x,y,c;scanf("%d%d%d",&x,&y,&c);
set<Data>::iterator it=p[x].lower_bound((Data){c,0}); if(it==p[x].begin()) continue; --it; int ln=(*it).ln+1; ans=max(ans,ln);
set<Data>::iterator it2=p[y].lower_bound((Data){c,0}); while(it2!=p[y].end()) { if((*it2).ln<=ln) p[y].erase(it2),it2=p[y].lower_bound((Data){c,0}); else break; } if(it2!=p[y].begin()) { --it2; if((*it2).ln<ln) p[y].insert((Data){c,ln}); } else p[y].insert((Data){c,ln}); } printf("%d",ans); } }; int main() { mine::main(); }
|
近期评论