// Source: https://usaco.guide/general/io
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define FOR(i,a,b) for(int i=1;i<=n;++i)
#define FORD(i,a,b) for(int i=n;i>=1;--i)
const int mxx=3;
const int N=1e6;
vector<int>block[N+2];
int n;
int a[N+2][mxx+2];
int win[N+2],cnt[4]={};
int streak_2[4][4],streak_3[4];
int Get_mn(int id){
return min({a[id][1],a[id][2],a[id][3]});
}
void same_compo(int i,int j,int gt){
int true_id=0,ogc=n+1;
for(int id=1;id<=3;++id){
if (min(a[i][id],a[j][id])==gt){
if (ogc>max(a[i][id],a[j][id])) {
ogc=max(a[i][id],a[j][id]);
true_id=id;
}
}
}
cnt[true_id]++;
for(int id=1;id<=3;++id){
if (id==true_id) {
if (a[i][id]>a[j][id]) win[j]++; else win[i]++;
}
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n;
int total=0;
for(int i=1;i<=mxx;++i){
for(int j=1;j<=n;++j){
int t; cin>>t;
a[t][i]=j;
}
}
for(int i=1;i<=n;++i) block[Get_mn(i)].push_back(i);
for(int i=n;i>=1;--i){
for(int id1=0;id1<(int)block[i].size();++id1){
for(int id2=id1+1;id2<(int)block[i].size();++id2){
same_compo(block[i][id1],block[i][id2],i);
}
}
for(auto&x:block[i]){
win[x]+=total;
//.... CHECKING WIN - STREAK
vector<int>pos;
for(int id=1;id<=3;++id){
if (a[x][id]==Get_mn(x)) pos.push_back(id);
}
if (pos.size()==1) cnt[pos[0]]+=total;
if (pos.size()==2) cnt[pos[0]]+=streak_2[pos[0]][pos[1]],cnt[pos[1]]+=streak_2[pos[1]][pos[0]];
if (pos.size()==3) {
for(int id=1;id<=3;++id) cnt[id]+=streak_3[id];
}
}
//... PRE-PROCESSING THE DATA FOR WIN STREAK 2 AND WIN STREAK 3
for(auto&x:block[i]){
int true_id=0,ogc=n+1;
for(int id=1;id<=3;++id){
if (ogc>a[x][id]) ogc=a[x][id],true_id=id;
for(int oid=id;oid<=3;++oid){
if (a[x][id]==a[x][oid]) streak_2[min(id,oid)][max(id,oid)]++;
if (a[x][id]>a[x][oid]) streak_2[oid][id]++;
if (a[x][id]<a[x][oid]) streak_2[id][oid]++;
}
}
streak_3[true_id]++;
}
total+=(int)block[i].size();
//... DEBUG PROGRESS
// printf("(DEBUG)\n");
// printf("-BLOCK- %d %d\n",i,(int)block[i].size());
// for(auto&x:block[i]) printf("%d ",x); printf("\n");
// printf("(END-DEBUG)\n");
}
cout<<cnt[1]<<' '<<cnt[2]<<' '<<cnt[3]<<'\n';
for(int i=1;i<=n;++i) cout<<win[i]<<" \n"[i==n];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |