您的位置:首页 > 其它

codeforces 673c[补]

2017-03-11 13:45 190 查看

BNUZ比赛训练【补】

感觉这道题没写出来。。简直怀疑当天晚上智商是不是-100000。超级暴力大水题。

题目:http://codeforces.com/problemset/problem/673/C

题目大意:

有n个数,可以构成n * (n - 1) / 2个区间,然后让你求1-n这每个数所占有的区间个数。

一个区间,被数量最大的数所占有,如果数量都是等大的话,那就被那个数的值最小的数占有

然后开始不知道哪里脑抽的开始敲。每次看每一位,每一位的前面和后面都扫一次,然后看那个值可以占有的区间。。然后敲完样例过完就死wa在3上了,然后。。心态崩溃,不想敲,赛后几分钟。。依旧照着这个思路想然后。。又想到了组合数学。。往前扫跟往后扫。。还要再排列组合一下。。我的天,越想脑子越炸。。

最终。。回去洗澡的时候又想。不是把区间枚举出来就好了。。然后每次统计的时候记录一下该区间每一个数的数量,然后再用一个mark标记一下当前数量的最小值是多少,然后每次让那个最小值的答案+1就好了。

我曹。我好菜啊。今天早上来到实验室。花了2分钟。。把代码全部重写了一次。1A。。。感觉我昨晚到底经历了什么。。。可能是被C题的排列组合带坏了。。orz

附上不知道为什么脑子抽完回来2分钟敲完的代码。。

/*
@rescoues: codeforces 673C
@date: 2017-3-10
@author: QuanQqqqq
@algorithm: brute force
*/
#include <bits/stdc++.h>

#define MAXN 5005
#define INF 0x3f3f3f
using namespace std;

int num[MAXN],total[MAXN],ans[MAXN],mark[MAXN];

int main(){
int n,mint,maxt;
while(~scanf("%d",&n)){
memset(ans,0,sizeof(ans));
for(int i = 0;i < n;i++){
scanf("%d",&num[i]);
}
int maxt;
for(int i = 0;i < n;i++){
memset(total,0,sizeof(total));
memset(mark,INF,sizeof(mark));
maxt = 0;
for(int j = i;j < n;j++){
total[num[j]]++;
mark[total[num[j]]] = min(mark[total[num[j]]],num[j]);
maxt = max(total[num[j]],maxt);
ans[mark[maxt]]++;
}
}
for(int i = 1;i <= n;i++){
if(i != 1){
printf(" ");
}
printf("%d",ans[i]);
}
printf("\n");
}
}


所以说。。我需要解释一下为什么我先掏出了线段树板后,两分钟又删掉了吗。。因为他是区间啊。区间找最大数量的最小值。。但是。再想想他在造区间的时候。时间复杂度已经O(n^2)了。。

于是。。脑子再次一抽的,删掉之后,敲了个前后缀数组。。。想在最短时间内计出最大数量的最小值。。但是有个毛病。就是中间的区间记录不了。。所以感觉脑子有毒。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces