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 <bits/stdc++.h>
using namespace std;
struct node {
int s, lz;
};
const int MAXN=1e5+5;
int qini[MAXN], qfim[MAXN];
pair<int, int> qv[MAXN];
multiset<int> s;
node seg[MAXN*4];
int v[MAXN];
int n, m, cara, conta;
int respf, maior;
void refresh(int sind, int ini, int fim) {
if(!seg[sind].lz) return;
seg[sind].s=0;
seg[sind].lz=0;
if(ini==fim) return;
int e=sind*2; int d=e+1;
seg[e].lz=seg[d].lz=1;
}
void update(int sind, int ini, int fim, int qini, int qfim) {
refresh(sind, ini, fim);
if(qini>fim||qfim<ini) return;
if(qini<=ini&&qfim>=fim) {
seg[sind].lz=1;
refresh(sind, ini, fim);
return;
}
int m=(ini+fim)/2; int e=sind*2; int d=e+1;
update(e, ini, m, qini, qfim);
update(d, m+1, fim, qini, qfim);
seg[sind].s=seg[e].s+seg[d].s;
}
int query(int sind, int ini, int fim, int val, int k) {
refresh(sind, ini, fim);
if(ini==fim) return seg[sind].s==val;
int m=(ini+fim)/2; int e=sind*2; int d=e+1;
refresh(e, ini, m); refresh(d, m+1, fim);
if(k==1) {
if(seg[e].s>=val) return query(e, ini, m, val, k);
else return (m-ini+1)+query(d, m+1, fim, val-seg[e].s, k);
}
else {
if(seg[e].s>val) return query(e, ini, m, val, k);
else return (m-ini+1)+query(d, m+1, fim, val-seg[e].s, k);
}
}
void build(int sind, int ini, int fim) {
if(ini==fim) {
seg[sind].s=1;
return;
}
int m=(ini+fim)/2; int e=sind*2; int d=e+1;
build(e, ini, m); build(d, m+1, fim);
seg[sind].s=seg[e].s+seg[d].s;
}
int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
n=N; m=C; cara=R;
for(int i=1; i<=n; i++) v[i]=K[i-1]<cara;
for(int i=1; i<=m; i++) qini[i]=S[i-1]+1, qfim[i]=E[i-1]+1;
build(1, 1, n);
for(int i=1; i<=m; i++) {
int ini=query(1, 1, n, qini[i], 1);
int fim=query(1, 1, n, qfim[i], 2);
qini[i]=ini; qfim[i]=fim;
qv[i]={ini, fim};
update(1, 1, n, ini+1, fim);
}
sort(qv+1, qv+1+m);
qv[m+1].first=qv[m+1].second=1e9;
int fim=0; int ind=0;
while(v[fim+1]) fim++; fim++;
for(int i=1; i<=n; i++) {
if(i==fim+1) {
fim=i-1;
while(v[fim+1]) fim++; fim++;
s.clear();
}
//printf("sendo %d (fim=%d)...\n", i, fim);
while(s.size()&&*s.begin()<i) s.erase(s.begin());
while(qv[ind+1].first<=i) {
ind++;
//printf(" add qv[%d] (%d %d)\n", ind, qv[ind].first, qv[ind].second);
if(qv[ind].second>fim) continue;
s.insert(qv[ind].second);
}
//printf(" %d > %d\n", i, s.size());
if(s.size()>maior) maior=s.size(), respf=i-1;
}
return respf;
}
Compilation message (stderr)
tournament.cpp: In function 'int GetBestPosition(int, int, int, int*, int*, int*)':
tournament.cpp:82:2: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
while(v[fim+1]) fim++; fim++;
^~~~~
tournament.cpp:82:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
while(v[fim+1]) fim++; fim++;
^~~
tournament.cpp:86:4: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
while(v[fim+1]) fim++; fim++;
^~~~~
tournament.cpp:86:27: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
while(v[fim+1]) fim++; fim++;
^~~
tournament.cpp:98:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(s.size()>maior) maior=s.size(), respf=i-1;
~~~~~~~~^~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |