#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = (1 << 18), OO = 1e9;
struct Noeud {
int mini, maxi, a, b;
int deb, fin;
void affine(int na, int nb){
a *= na;
b = b * na + nb;
mini = mini * na + nb;
maxi = maxi * na + nb;
if (mini > maxi)
swap(mini, maxi);
}
};
Noeud arbre[N * 2];
int cumul[N], res[N];
void push(int noeud){
for (int enfant = noeud * 2; enfant <= noeud * 2 + 1; ++enfant)
arbre[enfant].affine(arbre[noeud].a, arbre[noeud].b);
arbre[noeud].a = 1, arbre[noeud].b = 0;
}
int getKth(int noeud, int k){
if (noeud >= N)
return noeud - N;
push(noeud);
if (arbre[noeud * 2].maxi >= k)
return getKth(noeud * 2, k);
return getKth(noeud * 2 + 1, k);
}
int getMax(int noeud, int reql, int reqr, int a, int b){
if (arbre[noeud].fin <= reql || reqr <= arbre[noeud].deb)
return -OO;
if (reql <= arbre[noeud].deb && arbre[noeud].fin <= reqr){
arbre[noeud].affine(a, b);
return arbre[noeud].maxi;
}
push(noeud);
int maxl = getMax(noeud * 2, reql, reqr, a, b), maxr = getMax(noeud * 2 + 1, reql, reqr, a, b);
arbre[noeud].mini = min(arbre[noeud * 2].mini, arbre[noeud * 2 + 1].mini);
arbre[noeud].maxi = max(arbre[noeud * 2].maxi, arbre[noeud * 2 + 1].maxi);
return max(maxl, maxr);
}
int GetBestPosition(int nGars, int nRounds, int rangPaume, int *rangs, int *gauche, int *droite) {
for (int ind = N; ind < 2 * N; ++ind)
arbre[ind] = {ind - N, ind - N, 1, 0, ind - N, ind - N + 1};
for (int ind = N - 1; ind > 0; --ind)
arbre[ind] = {arbre[ind * 2].mini, arbre[ind * 2 + 1].maxi, 1, 0, arbre[ind * 2].deb, arbre[ind * 2 + 1].fin};
for (int iRound = 0; iRound < nRounds; ++iRound){
int ng = getKth(1, gauche[iRound]), nd = getKth(1, droite[iRound] + 1);
int pref = getMax(1, ng, ng + 1, 1, 0);
getMax(1, ng, nd, 0, pref);
getMax(1, nd, N, 1, -(droite[iRound] - gauche[iRound]));
gauche[iRound] = ng;
droite[iRound] = nd;
// cout << "t" << gauche[iRound] << " " << droite[iRound] << endl;
}
cumul[0] = 0;
//cout << "cum";
for (int ind = 1; ind < nGars; ++ind){
cumul[ind] = (rangs[ind - 1] > rangPaume) + cumul[ind - 1];
// cout << cumul[ind] << " ";
}
//cout << endl;
for (int iRound = 0; iRound < nRounds; ++iRound){
gauche[iRound]++;
// cout << "a " << gauche[iRound] << " " << droite[iRound] +1 << endl;
if ((cumul[droite[iRound] - 1] - cumul[gauche[iRound] - 1]) == 0){
//cout << "a " << gauche[iRound] << " " << droite[iRound] +1 << endl;
res[gauche[iRound]]++;
res[droite[iRound] + 1]--;
}
}
int iOpt = 1;
// cout << "res " << res[0] << " ";
for (int ind = 1; ind <= nGars; ++ind){
res[ind] += res[ind - 1];
// cout << res[ind] << " ";
if (res[ind] > res[iOpt])
iOpt = ind;
}
//cout << endl;
return iOpt - 1;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
12576 KB |
Output is correct |
2 |
Correct |
11 ms |
12620 KB |
Output is correct |
3 |
Correct |
10 ms |
12492 KB |
Output is correct |
4 |
Correct |
10 ms |
12620 KB |
Output is correct |
5 |
Correct |
9 ms |
12512 KB |
Output is correct |
6 |
Correct |
11 ms |
12592 KB |
Output is correct |
7 |
Correct |
10 ms |
12512 KB |
Output is correct |
8 |
Correct |
10 ms |
12492 KB |
Output is correct |
9 |
Correct |
9 ms |
12620 KB |
Output is correct |
10 |
Correct |
9 ms |
12620 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
11 ms |
12548 KB |
Output is correct |
2 |
Correct |
31 ms |
12608 KB |
Output is correct |
3 |
Correct |
15 ms |
12592 KB |
Output is correct |
4 |
Correct |
22 ms |
12656 KB |
Output is correct |
5 |
Correct |
20 ms |
12564 KB |
Output is correct |
6 |
Correct |
16 ms |
12648 KB |
Output is correct |
7 |
Correct |
26 ms |
12620 KB |
Output is correct |
8 |
Correct |
29 ms |
12664 KB |
Output is correct |
9 |
Correct |
12 ms |
12620 KB |
Output is correct |
10 |
Correct |
32 ms |
12756 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
121 ms |
13428 KB |
Output is correct |
2 |
Correct |
269 ms |
14732 KB |
Output is correct |
3 |
Correct |
39 ms |
13984 KB |
Output is correct |
4 |
Correct |
259 ms |
14532 KB |
Output is correct |
5 |
Correct |
266 ms |
14352 KB |
Output is correct |
6 |
Correct |
189 ms |
14248 KB |
Output is correct |
7 |
Correct |
307 ms |
14512 KB |
Output is correct |
8 |
Correct |
258 ms |
14512 KB |
Output is correct |
9 |
Correct |
21 ms |
13772 KB |
Output is correct |
10 |
Correct |
47 ms |
14372 KB |
Output is correct |