题目描述:
温州市政府要求大家要遵守交通规则,发扬尊老爱幼精神。文文想做一个关于公交文化的调查。他专门为排队上车发明了一套叫做“愧疚指数”的分析系统,就是在队列中把人分为三等:第一等为优先级最高,最需要照顾的老人、小孩、孕妇等,应该最优先上车,优先代号为1;第二等是普通女人,为了发扬绅士风度,男人是要让女人先上车的,但优先级低于一等,优先代号为2;第三等是普通男人,优先级最低,应该排在最后面,优先代号为3。所谓的“愧疚指数”是指队列中一个人后面有多少人的优先级比他高,如队列中有5个人分别为:3 2 1 2 1,那么这5个人的“愧疚指数”分别为:4 2 0 1 0。现在已经知道一个队列,请你帮文文算出队列中每个人的“愧疚指数”。
输入格式:
第一行是一个正整数n,表示一共有多少个人排队。
第二行有n个用空格隔开的正整数,它们从左至右给出了队列中n个人的优先代号。
输出格式:
输出一行:有n个用空格分开的正整数,代表队列中每个人的“愧疚指数”。
样例输入:
5 3 2 1 2 1
样例输出:
4 2 0 1 0
提示:
对于80%的数据,n≦10000;
对于100%的数据,n≦200000。
时间限制: 1000ms
空间限制: 256MB
代码需要从O(n^2)优化到O(n),否则会超时。
代码实现:
#include<bits/stdc++.h>
using namespace std;
long long s1,s2,a[10000001],b[10000001],n;
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=n;i>=1;i--){//由于输入是倒序输入,遍历也要倒序遍历
if(a[i]==1){
b[i]=0;
s1++;
//数字1出现了s1次
}
if(a[i]==2){
b[i]=s1;//比2小的只有1,所以这里标记的是1的个数
s2++;
//数字2出现了s2次
}
if(a[i]==3)b[i]=s2+s1;//1和2都比3小,所以比a[i]小的数是前面s1和s2的总和
}
for(int i=1;i<=n;i++)cout<<b[i]<<" ";
return 0;
}