poj 2380 Sales Report

Sales Report
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 1803 Accepted: 539

Description

The Unknown Trading Company have installed a new inventory-tracking system, which stores a complete database of goods and trading points worldwide. Each salespoint and each item was assigned an integer unique identifier (id). For every sale, the system logs id of the item, number of items sold, and id of the salespoint. 
未知的贸易公司安装了一个新的库存跟踪系统,它存储了一个关于商品,世界买卖点的数据库。 每个销售点和每个商品使用一个整数作为唯一标识符(ID)。 每次销售 ,系统记录会商品 id 销售商品的数量 和销售点的id
Your task is to output a summary report, tabulating total sales by items and salespoints. The report must be a two-dimensional table, with the first row containing item ids in increasing order, first column containing salespoint ids in increasing order, and values inside the table representing total sales of corresponding item from the corresponding salespoint. The value in first column of the first row must be −1. The values in cells without corresponding sales must be 0.
你的任务是输出一个总结报告,商品和销售点的总销量制成表格。 报告必须是一个二维表,第一行包含商品ID,以上升的顺序,第一列包括销售点的id,也是升序。 在第一行的第一列中的值必须−1。在格子中没有对应销量的填0

Input

Input contains number of records N, followed by N triplets of integers qi si vi, where qi -- item id, si -- salespoint id, vi -- number of items sold. 
1 ≤ N ≤ 500000, 1 ≤ qi, si, vi ≤ 10 9, the summary table will have no more than 10 8 cells, the summary value in each cell will not exceed than 2 31−1.
输入包括记录数量N,接着N行,每行三个数据,qi si vi,qi是 商品d,si是销售点id,vi是商品卖出去的数量。 1 ≤ N ≤ 500000, 1 ≤ qi, si, vi ≤ 10 9 ,表格的总数不会超过108 格子,每个格子的价值总和不会超过231−1。

Output

Output must a table as described above, row-by-row.
输出一个表格。

Sample Input

4
10 1 3
20 2 5
10 2 2
20 2 1

Sample Output

-1 10 20
1 3 0
2 2 6

Hint

This problem has huge input and output data,use scanf() and printf() instead of cin and cout to read data to avoid time limit exceed.

Source

Northeastern Europe 2004, Far-Eastern Subregion

这道题已经写疯了,wa到没脾气。。。
我是首先对s排序辅排q,然后对q单独排序,之后就按照s的排序顺序输出,每次输出在那个单独排序的q里面找对应的输出点。。。
一个是我用的是堆排,然后经常从1开始跑,结果有特殊情况,N=1的时候要特殊判断,死了一天。。。
然后要用c++交,用c交会超时,死了一天。。。
我这里面q单独排序也是用的堆排,排序过程中没有处理,所以排序后还要把排好顺序的队列给处理成没有重复数字的队列,这里可以优化。。。
再说吧,已经死了。。。。。。
#include <stdio.h>

#define PARENT(i) (i >> 1)
#define LEFT(i) (i << 1)
#define RIGHT(i) (i << 1) + 1

struct Sale{
    int q;
	int s;
	int v;
};

int N, heap_size;

void MAX_HEAPIFY(struct Sale *value_point, int i);
void BUILD_MAX_HEAP(struct Sale *value_point);
void HEAPSORT(struct Sale *value_point);

void MAX_HEAPIFY_q(int *q, int i);
void BUILD_MAX_HEAP_q(int *q);
void HEAPSORT_q(int *q);

int main(void){
	struct Sale value[500111];
	int q[500111];
	int  *p;
	int r_boundary, pos, k, i, sum;

//    freopen("in", "r", stdin);
        scanf("%d", &N);
		for (i = 1;i <= N;i ++){
			scanf("%d%d%d", &value[i].q, &value[i].s, &value[i].v);
			q[i] = value[i].q;
		}
		HEAPSORT(value);
		HEAPSORT_q(q);
		p = q+1;

//		for (i = 1;i <= N;i ++){
//			printf("value_point[%d], q = %d, s = %d, v = %d\n", i, value[i].q, value[i].s, value[i].v);
//		}
		for (i = 2;i <= N;i ++){
            if(q[i]> q[i-1]){
                p++;
                *p = q[i];
            }
		}

//		for (i =1;i <= N;i ++){
//            printf("%d ", q[i]);
//		}
        printf("-1");
		for (i = 1;i <= N;i ++){
            if (q[i-1] >= q[i]){
                printf("\n");
                r_boundary = i - 1;
                break;
            }else{
                printf(" %d", q[i]);
            }
            if (i == N){
                r_boundary = N;
                printf("\n");
            }
		}

//        printf("r_boundary= %d\n", r_boundary);
		printf("%d", value[1].s);
		k = 1;sum = 0;
		while(value[1].q != q[k]){printf(" 0");k++;}k++;
        sum += value[1].v;

        if (N == 1){
            printf(" %d\n", sum);
        }
		for (i = 2;i <= N;i ++){
		    if (value[i-1].s != value[i].s){
                printf(" %d", sum);
                while(k <= r_boundary){printf(" 0");k++;}
                printf("\n");
//                if (i == N) break;
                sum = 0;k = 1;
                printf("%d", value[i].s);
                while(value[i].q !=q[k] && k <= r_boundary){printf(" 0");k++;}k++;
		    }else{
                if(value[i-1].q != value[i].q){
                    printf(" %d", sum);
                    sum = 0;
                    while(value[i].q !=q[k] && k <= r_boundary){printf(" 0");k++;}k++;
                }
		    }
		    sum += value[i].v;
		    if (i == N){
                printf(" %d", sum);
                while(k < r_boundary + 1){printf(" 0");k++;}
                printf("\n");
		    }
		}
		return 0;
}

void MAX_HEAPIFY(struct Sale *value_point, int i){
	int l = LEFT(i);
	int r = RIGHT(i);
	int largest;
	struct Sale temp;

	if (l <= heap_size && (value_point+l)->s > (value_point+i)->s){
		largest = l;
	}else{
		largest = i;
	}
	if (l <= heap_size && (value_point+l)->s == (value_point+i)->s){
		if ((value_point+l)->q > (value_point+i)->q){
			largest = l;
		}else{
			largest = i;
		}
	}
	if (r <= heap_size && (value_point+r)->s > (value_point+largest)->s){
		largest = r;
	}
	if (r <= heap_size && (value_point+r)->s == (value_point+largest)->s){
		if ((value_point+r)->q > (value_point+largest)->q){
			largest = r;
		}
	}
	if (largest != i){
		temp = value_point[i]; value_point[i] = value_point[largest];value_point[largest] = temp;
		MAX_HEAPIFY(value_point, largest);
	}
}

void BUILD_MAX_HEAP(struct Sale *value_point){
    int i;
	heap_size = N;
	for (i = (heap_size >> 1); i >= 1;i --){
		MAX_HEAPIFY(value_point, i);
	}
}

void HEAPSORT(struct Sale *value_point){
	struct Sale temp;
    int i;
	BUILD_MAX_HEAP(value_point);
	for (i = heap_size;i >= 2;i --){
		heap_size --;
		temp = value_point[i];value_point[i] = value_point[1];value_point[1] = temp;
		MAX_HEAPIFY(value_point, 1);
	}
}

void MAX_HEAPIFY_q(int *q, int i){
	int l = LEFT(i);
	int r = RIGHT(i);
	int largest, temp;

	if (l <= heap_size && q[l] > q[i]){
		largest = l;
	}else{
		largest = i;
	}

	if (r <= heap_size && q[r] > q[largest]){
		largest = r;
	}

	if (largest != i){
		temp = q[i];q[i] = q[largest];q[largest] = temp;
		MAX_HEAPIFY_q(q, largest);
	}
}

void BUILD_MAX_HEAP_q(int *q){
    int i;
	heap_size = N;
	for (i = (heap_size >> 1); i >= 1;i --){
		MAX_HEAPIFY_q(q, i);
	}
}

void HEAPSORT_q(int *q){
	int temp;
    int i;
	BUILD_MAX_HEAP_q(q);
	for (i = heap_size;i >= 2;i --){
		heap_size --;
        temp = q[i];q[i] = q[1];q[1] = temp;
		MAX_HEAPIFY_q(q, 1);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值