A - Photo to Remember

A - Photo to Remember

One day n friends met at a party, they hadn’t seen each other for a long time and so they decided to make a group photo together.

Simply speaking, the process of taking photos can be described as follows. On the photo, each photographed friend occupies a rectangle of pixels: the i-th of them occupies the rectangle of width wi pixels and height hi pixels. On the group photo everybody stands in a line, thus the minimum pixel size of the photo including all the photographed friends, is W × H, where W is the total sum of all widths and H is the maximum height of all the photographed friends.

As is usually the case, the friends made n photos — the j-th (1 ≤ j ≤ n) photo had everybody except for the j-th friend as he was the photographer.

Print the minimum size of each made photo in pixels.

Input
The first line contains integer n (2 ≤ n ≤ 200 000) — the number of friends.

Then n lines follow: the i-th line contains information about the i-th friend. The line contains a pair of integers wi, hi (1 ≤ wi ≤ 10, 1 ≤ hi ≤ 1000) — the width and height in pixels of the corresponding rectangle.

Output
Print n space-separated numbers b1, b2, …, bn, where bi — the total number of pixels on the minimum photo containing all friends expect for the i-th one.

Examples
Input
3
1 10
5 5
10 1
Output
75 110 60
Input
3
2 1
1 2
2 1
Output
6 4 6

##第一次写可能有点水,见谅。

##这题的意思我就不详细说了(反正我也是看翻译的23333),我的思路是判断出最大的high以及其出现的次数和第二大的high。在输出时如果“照相人”的high是最大且high_max只出现过一次,那么相当于high_second就是high的(伪)最大值,用high_second带进(sum_weight - 该人的weight)*high_max然后输出即可。其他情况下high_max就是high的最大值。

我的AC代码(写得很复杂):

#include <stdio.h>
int main()
{
	int n;
	static int high[200000], weight[200000];
	while (scanf_s("%d", &n) != EOF)
	{
		long long sum = 0;
		int max = 0,max2=0;
		if (n >= 2 && n <= 200000)
		{
			int count = 0;
			for (int i = 0; i < n; i++) {
				scanf_s("%d %d", &weight[i], &high[i]);
				if (max == 0)
					max = high[i];
				else if (max < high[i])
					max = high[i];
				sum = sum + weight[i];
			}
			for (int i = 0; i < n; i++)
			{
				if (max == high[i])
					count++;
				else if (max2 < high[i] && max2 < max)
					max2 = high[i];
			}
			for (int j = 0; j < n; j++)
			{
				if (high[j] != max) {
					if (j != n - 1) {
						printf("%lld ", max*(sum - weight[j]));
					}
					else {
						printf("%lld\n", max*(sum - weight[j]));
					}
				}
				else if (high[j] == max)
				{
					if (count > 1) {
						if (j != n - 1) {
							printf("%lld ", max*(sum - weight[j]));
						}
						else {
							printf("%lld\n", max*(sum - weight[j]));
						}
					}
					else {
						if (j != n - 1) {
							printf("%lld ", max2*(sum - weight[j]));
						}
						else {
							printf("%lld\n", max2*(sum - weight[j]));
						}
					}
				}
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43900267/article/details/85014155