Codeforces673C Bear and Colors(枚举区间)

来源:互联网 发布:怎样在淘宝网卖闲置品 编辑:程序博客网 时间:2024/06/07 03:58
C. Bear and Colors
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Bear Limak has n colored balls, arranged in one long row. Balls are numbered1 through n, from left to right. There aren possible colors, also numbered 1 through n. The i-th ball has color ti.

For a fixed interval (set of consecutive elements) of balls we can define a dominant color. It's a color occurring the biggest number of times in the interval. In case of a tie between some colors, the one with the smallest number (index) is chosen as dominant.

There are non-empty intervals in total. For each color, your task is to count the number of intervals in which this color is dominant.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 5000) — the number of balls.

The second line contains n integers t1, t2, ..., tn (1 ≤ ti ≤ n) whereti is the color of thei-th ball.

Output

Print n integers. The i-th of them should be equal to the number of intervals where i is a dominant color.

Examples
Input
41 2 1 2
Output
7 3 0 0 
Input
31 1 1
Output
6 0 0 
Note

In the first sample, color 2 is dominant in three intervals:

  • An interval [2, 2] contains one ball. This ball's color is2 so it's clearly a dominant color.
  • An interval [4, 4] contains one ball, with color2 again.
  • An interval [2, 4] contains two balls of color 2 and one ball of color 1.

There are 7 more intervals and color 1 is dominant in all of them.

题意:已知一串数字,每种数字代表一种颜色,如果一个区间[i,j]中, ai颜色出现次数最多或者有和ai出现次数一样多的颜色但是颜色编号都比ai大,那么ai就是这个区间的领导颜色,统计各种颜色领导的区间数量。

思路:枚举所有的区间,维护最大值那个颜色,当出现新的最大值时,作出更改。

#include <bits/stdc++.h>using namespace std;#define maxn 5005int cnt[maxn];int dom[maxn];int a[maxn];int main(){    int n, i, j, best;    scanf("%d", &n);    for(i = 1;i <= n;i++){        scanf("%d", &a[i]);    }    for(i = 1;i <= n;i++)    {        memset(cnt, 0, sizeof cnt);        best = a[i];        dom[best]++;        cnt[a[i]]++;        for(j = i+1;j <= n;j++)        {            cnt[a[j]]++;            if(cnt[a[j]] > cnt[best]){                dom[a[j]]++;                best = a[j];            }            else if(cnt[a[j]] == cnt[best]&&a[j] < best){                dom[a[j]]++;                best = a[j];            }else dom[best]++;        }    }    for(i = 1;i <= n;i++) printf("%d%c", dom[i], i==n?'\n':' ');}

0 0
原创粉丝点击