1 #include <bits/stdc++.h>
2 using namespace std;
3 const int Maxn=2000100;
4 struct Info{int l,r;}P[Maxn];
5 int n,Cnt,F[Maxn];
6 map<int,int> M;
7 inline bool Cmp(Info A,Info B) {return A.r<B.r;}
8 inline int Max(int x,int y) {return x>y?x:y;}
9 inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
10 int main()
11 {
12
13     scanf("%d",&n); Cnt=0;
14     for (int i=1;i<=n;i++)
15     {
16         scanf("%d%d",&P[i].l,&P[i].r);
17         if (P[i].l>P[i].r) Swap(P[i].l,P[i].r);
18         M[P[i].l]=1,M[P[i].r]=1;
19     }
20     for (map<int,int>::iterator it=M.begin();it!=M.end();it++) it->second=++Cnt;
21     for (int i=1;i<=n;i++) P[i].l=M[P[i].l],P[i].r=M[P[i].r];
22     sort(P+1,P+n+1,Cmp); int j=1;
23     for (int i=1;i<=Cnt;i++)
24     {
25         while (j<=n && P[j].r==i)
26         {
27             F[i]=Max(F[i],F[P[j].l]+1);
28             j++;
29         }
30         F[i]=Max(F[i],F[i-1]);
31     }
32     printf("%d\n",F[Cnt]);
33     return 0;
34 }

 1 #include <bits/stdc++.h>
2 using namespace std;
3 const int Maxn=2000100;
4 struct Info{int l,r;}P[Maxn];
5 int n,Cnt,F[Maxn];
6 map<int,int> M;
7 inline bool Cmp(Info A,Info B) {return A.r<B.r;}
8 inline int Max(int x,int y) {return x>y?x:y;}
9 inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
10 int main()
11 {
12
13     scanf("%d",&n); Cnt=0;
14     for (int i=1;i<=n;i++)
15     {
16         scanf("%d%d",&P[i].l,&P[i].r);
17         if (P[i].l>P[i].r) Swap(P[i].l,P[i].r);
18         M[P[i].l]=1,M[P[i].r]=1;
19     }
20     for (map<int,int>::iterator it=M.begin();it!=M.end();it++) it->second=++Cnt;
21     for (int i=1;i<=n;i++) P[i].l=M[P[i].l],P[i].r=M[P[i].r];
22     sort(P+1,P+n+1,Cmp); int j=1;
23     for (int i=1;i<=Cnt;i++)
24     {
25         while (j<=n && P[j].r==i)
26         {
27             F[i]=Max(F[i],F[P[j].l]+1);
28             j++;
29         }
30         F[i]=Max(F[i],F[i-1]);
31     }
32     printf("%d\n",F[Cnt]);
33     return 0;
34 }

 1 #include <bits/stdc++.h>
2 using namespace std;
3 const int Maxn=20100;
4 struct Info{int l,r,w;}P[Maxn];
5 int n,Cnt,F[Maxn];
6 map<int,int> M;
7 inline bool Cmp(Info A,Info B) {return A.r<B.r;}
8 inline int Max(int x,int y) {return x>y?x:y;}
9 inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
10 int main()
11 {
12
13     scanf("%d",&n); Cnt=0;
14     for (int i=1;i<=n;i++)
15     {
16         scanf("%d%d%d",&P[i].l,&P[i].r,&P[i].w);
17         if (P[i].l>P[i].r) Swap(P[i].l,P[i].r);
18         M[P[i].l]=1,M[P[i].r]=1;
19     }
20     for (map<int,int>::iterator it=M.begin();it!=M.end();it++) it->second=++Cnt;
21     for (int i=1;i<=n;i++) P[i].l=M[P[i].l],P[i].r=M[P[i].r];
22     sort(P+1,P+n+1,Cmp); int j=1;
23     for (int i=1;i<=Cnt;i++)
24     {
25         while (j<=n && P[j].r==i)
26         {
27             F[i]=Max(F[i],F[P[j].l]+P[j].w);
28             j++;
29         }
30         F[i]=Max(F[i],F[i-1]);
31     }
32     printf("%d\n",F[Cnt]);
33     return 0;
34 }

 1 #include <bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 const int Maxn=1000010;
5 const int Inf=0x3f3f3f3f;
6 struct Info{int l,r,w;}P[Maxn];
7 int n,Cnt,a[Maxn<<1];
8 LL F[1500010];
9 inline bool Cmp(Info A,Info B) {return A.r<B.r;}
10 inline int Min(int x,int y) {return x>y?y:x;}
11 inline LL Max(LL x,LL y) {return x>y?x:y;}
12 inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
13 inline void Get_Int(int &x)
14 {
15     x=0; register char ch=getchar(); int f=1;
16     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
17     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} x*=f;
18 }
19 int main()
20 {
21
22     Get_Int(n);
23     for (int i=1;i<=n;i++)
24     {
25         Get_Int(P[i].l),Get_Int(P[i].r),Get_Int(P[i].w);
26         if (P[i].l>P[i].r) Swap(P[i].l,P[i].r);
27         a[i*2-1]=P[i].l,a[i*2]=P[i].r;
28     }
29     sort(a+1,a+n*2+1); Cnt=1;
30     for (int i=2;i<=2*n;i++) if (a[i]!=a[Cnt]) a[++Cnt]=a[i];
31     for (int i=1;i<=n;i++) P[i].l=lower_bound(a+1,a+Cnt+1,P[i].l)-a,P[i].r=lower_bound(a+1,a+Cnt+1,P[i].r)-a;
32
33
34     sort(P+1,P+n+1,Cmp); int j=1;
35     for (int i=1;i<=Cnt;i++)
36     {
37         while (j<=n && P[j].r==i)
38         {
39             F[i]=Max(F[i],F[P[j].l]+(LL)P[j].w);
40             j++;
41         }
42         F[i]=Max(F[i],F[i-1]);
43     }
44     printf("%lld\n",F[Cnt]);
45     return 0;
46 }

 1 #include <bits/stdc++.h>
2 #define LL long long
3 using namespace std;
4 const int Maxn=1000010;
5 const int Inf=0x3f3f3f3f;
6 struct Info{int l,r,w;}P[Maxn];
7 int n,Cnt,a[Maxn<<1];
8 LL F[Maxn<<1];
9 inline bool Cmp(Info A,Info B) {return A.r<B.r;}
10 inline int Min(int x,int y) {return x>y?y:x;}
11 inline LL Max(LL x,LL y) {return x>y?x:y;}
12 inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
13 inline void Get_Int(int &x)
14 {
15     x=0; register char ch=getchar(); int f=1;
16     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
17     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} x*=f;
18 }
19 int main()
20 {
21
22     Get_Int(n);
23     for (int i=1;i<=n;i++)
24     {
25         Get_Int(P[i].l),Get_Int(P[i].r),Get_Int(P[i].w);
26         if (P[i].l>P[i].r) Swap(P[i].l,P[i].r);
27         a[i*2-1]=P[i].l,a[i*2]=P[i].r;
28     }
29     sort(a+1,a+n*2+1); Cnt=1;
30     for (int i=2;i<=2*n;i++) if (a[i]!=a[Cnt]) a[++Cnt]=a[i];
31     for (int i=1;i<=n;i++) P[i].l=lower_bound(a+1,a+Cnt+1,P[i].l)-a,P[i].r=lower_bound(a+1,a+Cnt+1,P[i].r)-a;
32
33
34     sort(P+1,P+n+1,Cmp); int j=1;
35     for (int i=1;i<=Cnt;i++)
36     {
37         while (j<=n && P[j].r==i)
38         {
39             F[i]=Max(F[i],F[P[j].l]+(LL)P[j].w);
40             j++;
41         }
42         F[i]=Max(F[i],F[i-1]);
43     }
44     printf("%lld\n",F[Cnt]);
45     return 0;
46 }

不会贪心只会DP，Code都类似只不过中间用STL离散化被卡常了..