This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "september.h"
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> g;
vector<vector<int>> mxn;
vector<vector<int>> bck;
void dfs(int u){
for(int v : g[u]) dfs(v);
for(int i = 0; i < bck.size(); i++){
mxn[i][u] = bck[i][u];
for(int v : g[u]){
mxn[i][u] = max(mxn[i][u], mxn[i][v]);
}
}
}
vector<int> rndperm;
const int MOD = 1e9+7;
class HashedSet{
public:
int a, b, c, d, e;
HashedSet() : a(0), b(1), c(0), d(1000000000), e(0) {}
void insert(int x){
a += rndperm[x];
a %= MOD;
b = 1ll * b * rndperm[x] % MOD;
c = max(c, rndperm[x]);
d = min(d, rndperm[x]);
e ^= rndperm[x];
}
friend bool operator!=(const HashedSet& h1, const HashedSet& h2){
return h1.a != h2.a || h1.b != h2.b || h1.c != h2.c || h1.d != h2.d || h1.e != h2.e;
}
};
int solve(int N, int M, vector<int> F, vector<vector<int>> S) {
if(rndperm.empty()){
rndperm.resize(100005);
default_random_engine dre;
uniform_int_distribution<int> uid(2, 1000000000);
for(int i = 0; i <= 100000; i++) rndperm[i] = uid(dre);
}
g.resize(N);
for(int i = 1; i < N; i++){
g[F[i]].push_back(i);
}
bck.resize(M);
mxn.resize(M);
for(int i = 0; i < M; i++){
bck[i].resize(N);
mxn[i].resize(N);
for(int j = 0; j < N-1; j++){
bck[i][S[i][j]] = j;
}
}
dfs(0);
int k = 0;
int l = 0;
while(l < N-1){
// left: l
vector<HashedSet> ss(M);
int mnr = l-1;
int i = l;
bool ok = true;
do{
mnr++;
if(mnr >= N-1) exit(-1);
while(i <= mnr){
for(int j = 0; j < M; j++){
ss[j].insert(S[j][i]);
mnr = max(mnr, mxn[j][S[j][i]]);
}
i++;
}
for(int j = 1; j < M; j++) if(ss[j] != ss[0]) ok = false;
}while(!ok);
l = mnr+1;
k++;
}
g.clear();
bck.clear();
mxn.clear();
return k;
}
Compilation message (stderr)
september.cpp: In function 'void dfs(int)':
september.cpp:10:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
10 | for(int i = 0; i < bck.size(); i++){
| ~~^~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |