Advertisement
agul

20121030_problem3

Oct 30th, 2012
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <memory.h>
  5.  
  6. #define SEGMENTS_MAX_NUMBER 200000
  7.  
  8. struct segment {
  9.     int begin, end;
  10. };
  11.  
  12. void swap(segment * a, segment * b) {
  13.     segment t = *a;
  14.     *a = *b;
  15.     *b = t;
  16. }
  17.  
  18. int max(int a, int b) {
  19.     return (a < b ? b : a);
  20. }
  21.  
  22. void fail() {
  23.     printf("No solution");
  24.     exit(0);
  25. }
  26.  
  27. int n, curBegin, curEnd, ans, rightBorder, prevBorder, cur;
  28. segment segments[SEGMENTS_MAX_NUMBER];
  29.  
  30. void sort(int l, int r) {
  31.     int i = l, j = r, mediane = l + rand() % (r - l + 1), beginMediane = segments[mediane].begin, endMediane = segments[mediane].end;
  32.     do {
  33.         while (segments[i].begin < beginMediane || segments[i].begin == beginMediane && segments[i].end < endMediane) ++i;
  34.         while (segments[j].begin > beginMediane || segments[j].begin == beginMediane && segments[j].end > endMediane) --j;
  35.         if (i <= j) {
  36.             swap(segments + i, segments + j);
  37.             ++i;
  38.             --j;
  39.         }
  40.     } while (i <= j);
  41.     if (l < j) sort(l, j);
  42.     if (i < r) sort(i, r);
  43. }
  44.  
  45. int main() {
  46.     srand(time(NULL));
  47.     scanf("%d", &n);
  48.     for (int i = 0; i < n; ++i) {
  49.         scanf("%d%d", &curBegin, &curEnd);
  50.         segments[i].begin = curBegin;
  51.         segments[i].end = curEnd;
  52.     }
  53.     sort(0, n - 1);
  54.     if (segments[0].begin > 0) fail();
  55.     ans = rightBorder = prevBorder = cur = 0;
  56.     while (rightBorder < 1000) {
  57.         while (cur < n && segments[cur].begin <= prevBorder) rightBorder = max(rightBorder, segments[cur++].end);
  58.         if (rightBorder == prevBorder) fail();
  59.         ++ans;
  60.         prevBorder = rightBorder;
  61.     }
  62.     printf("%d", ans);
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement