Esempio n. 1
0
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;
}
Esempio n. 2
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;
            }
        }
    }
}
Esempio n. 3
0
// 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;
 }
Esempio n. 5
0
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);
}
Esempio n. 6
0
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;
}
Esempio n. 7
0
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, &regfontextents);
    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]),
                   &notused, &notused, &width1, &notused);
    CalTextExtents(w->font, "  00", cm_strlen("  00"),
                   &notused, &notused, &width2, &notused);
    CalTextExtents(w->font, "Wed 00", cm_strlen("Wed 00"),
                   &notused, &notused, &width3, &notused);
    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);
}
Esempio n. 8
0
/*
 * 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, &regfontextents);
    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;
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
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