Advertisement
Guest User

Timus 1303

a guest
Nov 30th, 2010
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. #include<cstdio>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6.  
  7. const int INF=1000000000;
  8.  
  9. struct segment {
  10.     int l,r;
  11. } a[100001];
  12.  
  13. bool operator < (segment a,segment b) {
  14.     if (a.r==b.r) return (a.l<b.l);
  15.     return (a.r<b.r);
  16. }
  17.  
  18. bool cmp(int i,int j) {
  19.     return (a[i].l<a[j].l);
  20. }
  21.  
  22. int dp[5002],pre[5002],seg[5002],ans[5002];
  23. int n,m,z;
  24.  
  25. int main() {
  26.     //freopen("input.txt","rt",stdin);
  27.     //freopen("output.txt","wt",stdout);
  28.     scanf("%d",&m); m++;
  29.     int l,r;
  30.     scanf("%d %d",&l,&r);
  31.     while (l!=0 || r!=0) {
  32.         a[n].l=l+1; a[n].r=r+1; n++; scanf("%d %d",&l,&r);
  33.     }
  34.     //a[n].l=1; a[n].r=1; n++;
  35.     sort(a,a+n);
  36.     for (int i=1;i<=m;i++) dp[i]=INF;
  37.     for (int i=0;i<n;i++) {
  38.         if (a[i].r<1 || a[i].l>m) continue;
  39.         int ll=max(a[i].l,1);
  40.         int rr=min(a[i].r,m);
  41.         int cur=dp[ll-1];
  42.         //if (cur+1<dp[rr])
  43.             for (int j=rr;j>=ll;j--) {
  44.                 if (cur+1<dp[j]) {
  45.                     dp[j]=cur+1;
  46.                     seg[j]=i;
  47.                     pre[j]=ll-1;
  48.                 } //else break;
  49.             }
  50.     }
  51.     if (dp[m]==INF) {printf("No solution"); return 0; }
  52.     for (int i=m;i!=0;i=pre[i]) ans[z++]=seg[i];
  53.     sort(ans,ans+z);
  54.     printf("%d\n",z);
  55.     for (int i=0;i<z;i++) {
  56.         printf ("%d %d\n",a[ans[i]].l-1,a[ans[i]].r-1);
  57.     }
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement