int main() { int n, test, cs, p; scanf("%d", &cs); for(test = 1; test <= cs; test++) { scanf("%d", &n); p = lowerbound(MIN, MAX, n); if(zeros(p) == n) printf("Case %d: %d\n", test, p); else printf("Case %d: impossible\n", test); } return 0; }
static void fill_day(Calendar *c, Week *w, int x, int y, int day, Paint_cache *cache, int a_total, XRectangle *rect) { CSA_return_code stat; Dtcm_appointment *appt; register int lower = (int)lowerbound(day); register int upper = (int)next_ndays(day, 1); register int i, loop, n; register int nlines = 0; XFontSetExtents fontextents; int char_width; int char_height; int maxlines; int maxchars; Tick tick; CalFontExtents(w->small_font, &fontextents); char_width = fontextents.max_logical_extent.width; char_height = fontextents.max_logical_extent.height; maxlines = ((w->day_height - w->label_height) / char_height)- 1; maxchars = (w->day_width / char_width); #if 0 x += char_width; #endif x += 3; y += (w->label_height + char_height); /* * Fill in a day with appointments */ /* loop thru twice, first displaying "no time" appointments, and then the others. */ for (loop = 0; loop < 2; loop++) { for (i = 0; i < a_total; i++) { if ((cache[i].start_time < lower) || (cache[i].start_time >= upper)) continue; if (cache[i].show_time != loop) continue; if (nlines < maxlines) { n = paint_entry(c, x, y, maxchars, &cache[i], rect); y += n * char_height; nlines += n; } } } }
// Give the duration of the interval between begin and end in seconds long long int duration(const int* begin, const int* end) { int b[6]; int e[6]; // Fill in missing values appropriately upperbound(begin, b); lowerbound(end, e); // Lowerbound both where both had -1 for (int i = 0; i < 6; ++i) if (begin[i] == -1 && end[i] == -1) b[i] = e[i] = (i == 1 || i == 2) ? 1 : 0; // Find the smaller year, to use as a reference for secondsfrom int y = b[0] < e[0] ? b[0] : e[0]; return secondsfrom(y, e) - secondsfrom(y, b); }
vector<int> searchRange(int A[], int n, int target) { int start = lowerbound(A, n, target); int end = upperbound(A, n, target); if (start != -1) { if (A[start] != target) start = -1; } if (end == -1) { if (A[n-1] == target) end = n-1; } else { if (A[end-1] == target) end--; else end = -1; } vector<int> result(2); result[0] = start; result[1] = end; return result; }
static int count_week_pages (Calendar *c, int lines_per_page, Tick start_date) { time_t start, stop; CSA_return_code stat; CSA_entry_handle *list; CSA_attribute *range_attrs; CSA_enum *ops; CSA_uint32 a_total; int num_appts, i, j, max = 0, pages; /* count the times and text of appts */ for (i = 1; i <= 7; i++) { /* setup a time limit for appts searched */ start = (time_t) lowerbound (start_date); stop = (time_t) next_ndays(start_date, 1) - 1; setup_range(&range_attrs, &ops, &j, start, stop, CSA_TYPE_EVENT, 0, B_FALSE, c->general->version); csa_list_entries(c->cal_handle, j, range_attrs, ops, &a_total, &list, NULL); free_range(&range_attrs, &ops, j); num_appts = count_multi_appts(list, a_total, c); if (num_appts > max) max = num_appts; start_date = nextday(start_date); csa_free(list); } pages = max / lines_per_page; if ((max % lines_per_page) > 0) pages++; return(pages); }
void ANC::search(const fDataSet *baseset, const fDataSet *queryset, char *folder, int nk, DoubleIndex **knnset, Cost *cost, int lb_type) { char filename[256]; int nq = queryset->n, qi, i, set_i; int cid; float knn_R; float *set; int *set_id; int set_num; float *set_vector = NULL; float *query = fvec_new(d); DoubleIndex candidate; DoubleIndex *lb = (DoubleIndex*)malloc(sizeof(DoubleIndex)*ncenter); // lower bounds between query and all centers Cost costi; struct timeval tvb, tve, tvb_lb, tve_lb, tvb_io, tve_io; for(qi = 0; qi < nq; qi++) { /// initialize the cost recorder CostInit(&costi); gettimeofday(&tvb, NULL); /// the qi-th query memcpy(query, queryset->data+qi*d, sizeof(float)*d); knnset[qi] = (DoubleIndex*)malloc(sizeof(DoubleIndex)*nk); /// calculate and sort the lower bounds between query and all clusters to get the right order gettimeofday(&tvb_lb, NULL); if((int)Algorithm_Search_CrossLB == lb_type){ lowerbound_crosspoint(lb, query); }else if((int)Algorithm_Search == lb_type){ lowerbound(lb, query, true); } gettimeofday(&tve_lb, NULL); costi.lowerbound = timediff(tvb_lb, tve_lb); /// search for knn set_vector = fvec_new(d); knn_R = FLOAT_MAX; i = 0; Heap heap(nk); while(i < ncenter) { cid = lb[i].id; // the i-th cluster if(f_bigger(lb[i].val, knn_R)) { break; } // knn_R > lb[i], means there are candidates in the i-th cluster set_num = member[cid].size(); set = fvec_new(set_num*d); set_id = ivec_new(set_num); /* we do not test the time cost of disk page for speed, we do not really load the data sprintf(filename, "%s/%d.cluster", folder, cid); gettimeofday(&tvb_io, NULL); HB_ClusterFromFile(filename, set_num, d, set, set_id); gettimeofday(&tve_io, NULL); costi.io = costi.io + timediff(tvb_io, tve_io); */ /* instead, we extract member points directly from the base set */ for(int mi = 0; mi < set_num; mi++){ int pts_id = member[cid][mi]; set_id[mi] = pts_id; memcpy(set+mi*d, baseset->data+pts_id*d, sizeof(float)*d); } // update cost costi.page = costi.page + 1; costi.point = costi.point + set_num; for(set_i = 0; set_i < set_num; set_i++) {// calculate real distance between all candidates and query candidate.id = set_id[set_i]; memcpy(set_vector, set+set_i*d, sizeof(float)*d); candidate.val = odistance(query, set_vector, d); if(heap.length < heap.MaxNum || f_bigger(heap.elem[0].val, candidate.val)) {// heap is not full or new value is smaller, insert heap.max_insert(&candidate); } } knn_R = heap.elem[0].val; i++; // free free(set); set = NULL; free(set_id); set_id = NULL; }// end of search loop // printf("%d ", i);// memcpy(knnset[qi], heap.elem, sizeof(DoubleIndex)*heap.length); gettimeofday(&tve, NULL); costi.cpu = timediff(tvb, tve); costi.search = costi.cpu - costi.lowerbound - costi.io; /// sum new cost CostCombine(cost, &costi); } CostMultiply(cost, 1/(float)nq); free(set_vector); set_vector = NULL; free(query); query = NULL; free(lb); lb = NULL; }
static void draw_week(Calendar *c, XRectangle *rect, Boundary boundary) { Week *w = (Week *)c->view->week_info; register int current_day; register int n; register int x, y; int char_height; int start_date; char **day_names; char label[80]; char buf[MAXNAMELEN]; char *footer_message = NULL; int start_ind, end_ind; int today_dom, day_om; new_XContext *xc; Props *p = (Props*)c->properties; XRectangle chartrect; OrderingType ot = get_int_prop(p, CP_DATEORDERING); Tick start_tick, end_tick; time_t start, stop; CSA_return_code stat; CSA_entry_handle *list; CSA_attribute *range_attrs; CSA_enum *ops; CSA_uint32 a_total; int i, lower_bound = 0, upper_bound = 0; XFontSetExtents regfontextents, boldfontextents; int notused, width1, width2, width3; CalFontExtents(w->font, ®fontextents); char_height = regfontextents.max_logical_extent.height; start_date = w->start_date; xc = c->xcontext; start = (time_t) lowerbound(start_date); stop = (time_t) next_ndays(start, 7) - 1; if (c->paint_cache == NULL) { setup_range(&range_attrs, &ops, &i, start, stop, CSA_TYPE_EVENT, 0, B_FALSE, c->general->version); csa_list_entries(c->cal_handle, i, range_attrs, ops, &a_total, &list, NULL); free_range(&range_attrs, &ops, i); allocate_paint_cache(list, a_total, &c->paint_cache); c->paint_cache_size = a_total; csa_free(list); } gr_clear_box(xc, 0, 0, w->canvas_w, w->canvas_h); CalTextExtents(w->font, days2[3], cm_strlen(days2[3]), ¬used, ¬used, &width1, ¬used); CalTextExtents(w->font, " 00", cm_strlen(" 00"), ¬used, ¬used, &width2, ¬used); CalTextExtents(w->font, "Wed 00", cm_strlen("Wed 00"), ¬used, ¬used, &width3, ¬used); if (width1 + width2 <= w->day_width - 2) day_names = days2; else if (width3 <= w->day_width - 2) day_names = days; else day_names = days3; x = w->x; y = w->y; format_week_header(start_date, ot, label); gr_text(xc, x, y - char_height / 2, w->font, label, rect); /* * Draw bold box around first 5 days */ gr_draw_box(xc, x, y, w->width, w->day_height, rect); gr_draw_box(xc, x - 1, y - 1, w->width + 2, w->day_height + 2, rect); gr_draw_line(xc, x, y + w->label_height, x + w->width, y + w->label_height, gr_solid, rect); /* * Draw bold box around last 2 days */ x += 3 * w->day_width; y += w->day_height; gr_draw_box(xc, x, y, 2 * w->day_width, w->day_height, rect); gr_draw_box(xc, x - 1, y, 2 * w->day_width + 2, w->day_height + 1,rect); gr_draw_line(xc, x, y + w->label_height, x + 2 * w->day_width, y + w->label_height, gr_solid, rect); y = w->y; x = w->x + w->day_width; for (n = 0; n < 4; n++) { if (n < 3) { gr_draw_line(xc, x, y, x, y + w->day_height, gr_solid, rect); } else { gr_draw_line(xc, x, y, x, y + 2 * w->day_height, gr_solid, rect); } x += w->day_width; } /* * Fill in week with appointments */ x = w->x; y = w->y; current_day = start_date; today_dom = dom(time(0)); /* Crock alert!!!! The obscure code below is doing something really nasty. The variable boundary indicates whether the week being displayed falls across a boundary with the beginning or the end of time. In the case of the beginning of time, the code then assumes that the first 2 days in the week need to be unbuttoned, and the rest buttoned and painted. Likewise, with the end of time case, the code assumes the last 3 days of the week need similar treatment. */ for (n = 0; n < 7; n++) { if (n == 5) { y += w->day_height; x = w->x + 3 * w->day_width; } if (boundary == okay) { day_om = dom(current_day); display_hot_btn(c, n, day_om); fill_day(c, w, x, y, current_day, c->paint_cache, c->paint_cache_size, rect); current_day += daysec; if (lower_bound > 0) { sprintf(buf, "%s", catgets(c->DT_catd, 1, 623, "Calendar does not display dates prior to January 1, 1970")); footer_message = buf; } else footer_message = NULL; } else if (boundary == lower) { /* skip days before Jan 1, 1970 */ clear_hot_btn(c, n); if (lower_bound++ == 2) boundary = okay; } else if (boundary == upper) { day_om = dom(current_day); if (++upper_bound <= 4) display_hot_btn(c, n, day_om); fill_day(c, w, x, y, current_day, c->paint_cache, c->paint_cache_size, rect); current_day += daysec; sprintf(buf, "%s", catgets(c->DT_catd, 1, 624, "Calendar does not display dates after December 31, 2037")); footer_message = buf; if (upper_bound > 4) clear_hot_btn(c, n); } x += w->day_width; } if (rect != NULL) { CalFontExtents(w->small_bold_font, &boldfontextents); chartrect.x = w->x; chartrect.y = w->chart_y - w->label_height; chartrect.width = w->chart_width + 3*boldfontextents.max_logical_extent.width; chartrect.height = w->chart_height + 2*w->label_height; } if (rect == NULL || myrect_intersectsrect(rect, &chartrect)) { for (i = 0; i < c->paint_cache_size; i++) { start_tick = (c->paint_cache)[i].start_time; end_tick = (c->paint_cache)[i].end_time; cm_update_segs(w, start_tick, (end_tick ? (end_tick - start_tick) : 0), &start_ind, &end_ind, True); } chart_draw_appts(w, 0, w->segs_in_array); draw_chart(c, w, NULL); } /* do not repaint the footer message in a damage display. For some reason this causes the damage routine to get called again, resulting in a recursive dsaster. */ if (footer_message && !rect) set_message(c->message_text, footer_message); }
/* * Set up data needed to draw this particular week */ static void init_week(Calendar *c, Boundary *boundary) { Week *w = (Week *)c->view->week_info; int char_width, char_height; Props *p; int num_hrs, day_of_week; int empty_space, day_box; int skip_days = 0; XFontSetExtents regfontextents, boldfontextents; *boundary = okay; /* * The week view starts on Monday. Map Sunday to the last day of the * week */ if ((day_of_week = dow(c->view->date)) == 0) day_of_week = 6; else day_of_week--; ((Selection*)w->current_selection)->col = day_of_week; w->start_date = lowerbound(c->view->date - (day_of_week * daysec)); /* make sure date is within bounds */ if (w->start_date == -1) { if (year(c->view->date) == year(get_bot())) { w->start_date = get_bot(); *boundary = lower; } } else if (year(next_ndays(w->start_date, 7)) > year(get_eot())) { *boundary = upper; } /* * Set up a bunch of variables which are needed to draw and fill * the week at a glance screen */ XtVaGetValues(c->canvas, XmNwidth, &w->canvas_w, XmNheight, &w->canvas_h, NULL); w->font = c->fonts->labelfont; w->small_font = c->fonts->viewfont; w->small_bold_font = c->fonts->boldfont; CalFontExtents(w->font, ®fontextents); CalFontExtents(w->small_bold_font, &boldfontextents); w->x = c->view->outside_margin; w->y = 2 * (int) boldfontextents.max_logical_extent.height; char_height = regfontextents.max_logical_extent.height; char_width = regfontextents.max_logical_extent.width; w->label_height = char_height * 2; w->day_width = ((int) (w->canvas_w - 2 * w->x)) / 5; /* height of box with label */ w->day_height = ((int) (w->canvas_h - 2 * w->y)) / 2; /* * We compute week dimensions from day dimensions to remove rounding * errors */ w->width = w->day_width * 5; /* height from top of box to bottom of weekend boxes */ w->height = w->day_height * 2; p = (Props *)c->properties; w->begin_hour = get_int_prop(p, CP_DAYBEGIN); w->end_hour = get_int_prop(p, CP_DAYEND); /* width of a column in chart */ w->chart_day_width = (3 * w->day_width - 3 * char_width) / 7; /* width of chart */ w->chart_width = w->chart_day_width * 7; num_hrs = w->end_hour - w->begin_hour; /* height of box without label */ day_box = w->day_height - w->label_height; /* height of an hour in chart */ w->chart_hour_height = day_box / num_hrs; /* chart_hour_height must be evenly divisble by BOX_SEG */ w->chart_hour_height -= (w->chart_hour_height % BOX_SEG); w->chart_height = w->chart_hour_height * num_hrs; /* x point of upper left corner of chart */ w->chart_x = w->x + 2 * boldfontextents.max_logical_extent.width; /* y point of upper left corner of chart */ w->chart_y = w->y + w->height - w->chart_height; /* left over empty space above chart after round off error */ empty_space = day_box - w->chart_height; /* add pixels to the height of each hour box in chart to fill gap*/ if (w->add_pixels = ((double)empty_space / (double)num_hrs)) { w->chart_y -= w->add_pixels * num_hrs; w->chart_height += w->add_pixels * num_hrs; } w->segs_in_array = BOX_SEG * num_hrs * 7; if (w->time_array != NULL) free(w->time_array); w->time_array = (char*)ckalloc(w->segs_in_array); c->view->outside_margin = w->x; c->view->topoffset = w->y; }
static Boolean print_week (Calendar *c, int num_page, void *xp, Tick first_date, Props *p, Boolean first) { Boolean more, done = False, all_done = True; int num_appts, day_of_week; char buf[128]; int i, j; OrderingType ot = get_int_prop(p, CP_DATEORDERING); time_t start, stop; CSA_return_code stat; CSA_entry_handle *list; CSA_attribute *range_attrs; CSA_enum *ops; CSA_uint32 a_total; int lines_per_page; static Tick start_date = 0; static int total_pages; static char *days[] = { (char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL }; if (days[0] == (char *)NULL) { days[0] = XtNewString(catgets(c->DT_catd, 1, 596, "Monday %d")); days[1] = XtNewString(catgets(c->DT_catd, 1, 597, "Tuesday %d")); days[2] = XtNewString(catgets(c->DT_catd, 1, 598, "Wednesday %d")); days[3] = XtNewString(catgets(c->DT_catd, 1, 599, "Thursday %d")); days[4] = XtNewString(catgets(c->DT_catd, 1, 600, "Friday %d")); days[5] = XtNewString(catgets(c->DT_catd, 1, 601, "Saturday %d")); days[6] = XtNewString(catgets(c->DT_catd, 1, 602, "Sunday %d")); } x_init_printer(xp, LANDSCAPE); x_init_week(xp); lines_per_page = x_get_week_lines_per_page(xp); if (first) start_date = first_date; if (num_page > 1) { start_date = prevweek(start_date); if (!timeok(start_date)) start_date = get_bot(); } else total_pages = (lines_per_page > 0) ? count_week_pages(c, lines_per_page, start_date) : 1; format_week_header(start_date, ot, buf); x_print_header(xp, buf, num_page, total_pages); x_week_appt_boxes(xp); x_week_sched_boxes(xp); /* print the times and text of appts */ for (i = (dow(start_date) + 6) % 7; i < 7; i++) { /* print <Weekday DD> centered at top of appt box */ x_week_sched_init(xp); sprintf(buf, days[i], dom(start_date)); /* setup a time limit for appts searched */ start = (time_t) lowerbound (start_date); stop = (time_t) next_ndays(start_date, 1) - 1; setup_range(&range_attrs, &ops, &j, start, stop, CSA_TYPE_EVENT, 0, B_FALSE, c->general->version); csa_list_entries(c->cal_handle, j, range_attrs, ops, &a_total, &list, NULL); free_range(&range_attrs, &ops, j); num_appts = count_multi_appts(list, a_total, c); if ((lines_per_page > 0) && (num_appts > (lines_per_page * num_page))) more = True; else more = False; x_week_daynames(xp, buf, i, more); /* print out times and appts */ if (lines_per_page > 0) done = x_print_multi_appts(xp, list, a_total, num_page, weekGlance); else done = True; if (!done) all_done = False; x_week_sched_draw(xp, i); start_date = nextday(start_date); csa_free(list); } x_finish_printer(xp); return(all_done); }
double RNG::tnorm(double left, double right) { // The most difficult part of this algorithm is figuring out all the // various cases. An outline is summarized in the Appendix. // Check input #ifdef USE_R if (ISNAN(right) || ISNAN(left)) #else if (std::isnan(right) || std::isnan(left)) #endif { fprintf(stderr, "Warning: nan sent to RNG::tnorm: left=%g, right=%g\n", left, right); TREOR("RNG::tnorm: parameter problem.\n", 0.5 * (left + right)); // throw std::runtime_error("RNG::tnorm: parameter problem.\n"); } if (right < left) { fprintf(stderr, "Warning: left: %g, right:%g.\n", left, right); TREOR("RNG::tnorm: parameter problem.\n", 0.5 * (left + right)); } double rho, ppsl; int count = 1; if (left >= 0) { double lbound = lowerbound(left); if (right > lbound) { // Truncated Exponential. double astar = alphastar(left); while (true) { ppsl = texpon_rate(left, right, astar); rho = exp(-0.5*(ppsl - astar)*(ppsl-astar)); if (unif() < rho) return ppsl; if (count > RCHECK * 10) fprintf(stderr, "left >= 0, right > lbound; count: %i\n", count); // if (ppsl < right) return ppsl; } } else { while (true) { ppsl = flat(left, right); rho = exp(0.5 * (left*left - ppsl*ppsl)); if (unif() < rho) return ppsl; check_R_interupt(count++); #ifndef NDEBUG if (count > RCHECK * 10) fprintf(stderr, "left >= 0, right <= lbound; count: %i\n", count); #endif } } } else if (right >= 0) { if ( (right - left) < SQRT2PI ){ while (true) { ppsl = flat(left, right); rho = exp(-0.5 * ppsl * ppsl); if (unif() < rho) return ppsl; check_R_interupt(count++); #ifndef NDEBUG if (count > RCHECK * 10) fprintf(stderr, "First, left < 0, right >= 0, count: %i\n", count); #endif } } else{ while (true) { ppsl = norm(0, 1); if (left < ppsl && ppsl < right) return ppsl; check_R_interupt(count++); #ifndef NDEBUG if (count > RCHECK * 10) fprintf(stderr, "Second, left < 0, right > 0, count: %i\n", count); #endif } } } else { return -1. * tnorm(-1.0 * right, -1.0 * left); } } // tnorm