المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره ی تابستان:دوره ی ۱۸:برنامه نویسی:سوال ۱۳

بازه‌های یک‌تا

قرارست برنامه‌ای بنویسیم که ‎$1 \le n \le 1000$‎ بازه (به‌صورت ‎$[\text{begin},\text{end}]$‎) از ورودی خوانده و بازه‌های تکراری را از میان آن‌ها حذف کرده و سپس بازه‌های باقی‌مانده را الزاماً به همان ترتیب ورودی در خروجی بنویسد. در صورتی که یک بازه چند بار تکرار شده باشد، تنها اوّلین بار وقوع آن باید باقی بماند و سایر دفعات تکرار باید حذف شوند.

برای رسیدن به این هدف برنامه‌ی زیر و تابع DeleteRepeatedIntervals‎ نوشته شده است. این تابع را با کمک توابع ‎STL‎ و ‎…‎ در حداقل تعداد خط کامل کنید.

شما مجاز به تعریف حداکثر ‎۲‎ تابع دیگر و حافظه‌ی ‎$O(1)$‎ اضافی هستید. دقت کنید که زمان اجرای برنامه‌ی شما باید از ‎$O(n^2)$‎ کم‌تر (و نه حتی مساوی) باشد.

#include <cstdio>
#include <algorithm>
 
int n;
struct R { 
  int begin, end, id;
} a[1000];
 
void DeleteRepeatedIntervals(R a[], int n) {
  // implement this function
}
 
int main() {
  scanf("%d", &n);
  for (int i=0; i<n; i++)
     scanf("%d %d", &a[i].begin, &a[i].end);
  DeleteRepeatedIntervals(a, n);
  for (int i=0; i<n; i++)
    printf("%d %d\n", a[i].begin, a[i].end);
  return 0;
}

ابزار صفحه