#include <bits/stdc++.h>
using namespace std;
mt19937 mt(869120);
struct treap{
int pri,size,range_l,range_r,type;
treap *lch,*rch;
treap(int l,int r,int t){
lch=rch=NULL;
range_l=l;
range_r=r;
type=t;
pri=mt();
size=1;
}
treap(){
}
};
int size(treap *pt){
if(pt==NULL)return 0;
return pt->size;
}
treap* update(treap *pt){
pt->size=size(pt->lch)+size(pt->rch)+1;
return pt;
}
treap* merge(treap *l,treap *r){
if(l==NULL)return r;
else if(r==NULL)return l;
if(l->pri>r->pri){
l->rch=merge(l->rch,r);
return update(l);
}
else{
r->lch=merge(l,r->lch);
return update(r);
}
}
pair<treap*,treap*>split(treap* pt,int t){
if(pt==NULL)return{NULL,NULL};
if(t<=size(pt->lch)){
auto p=split(pt->lch,t);
pt->lch=p.second;
return {p.first,update(pt)};
}
else{
auto p=split(pt->rch,t-size(pt->lch)-1);
pt->rch=p.first;
return{update(pt),p.second};
}
}
void dfs(int &l,int &r,vector<int>&v,treap*pt){
if(pt==NULL)return;
l=min(l,pt->range_l);
r=max(r,pt->range_r);
if(pt->type!=-1){
v.push_back(pt->type);
}
dfs(l,r,v,pt->lch);
dfs(l,r,v,pt->rch);
}
int tree[1<<18],A[100000],P[100000],L[100000],R[100000],V[100000];
treap tre[200000];
treap *root;
int calc(int l,int r){
l+=1<<17;
r+=1<<17;
int a=-1;
while(l<=r){
a=max({a,tree[l],tree[r]});
l=(l+1)/2;
r=(r-1)/2;
}
return a;
}
int GetBestPosition(int N, int C, int T, int *K, int *S, int *E) {
for(int i=0;i<N-1;i++){
tree[i+(1<<17)]=K[i];
}
for(int i=(1<<17)-1;i;i--){
tree[i]=max(tree[i+i],tree[i+i+1]);
}
for(int i=0;i<N;i++){
tre[i]=treap(i,i,-1);
}
root=tre;
for(int i=1;i<N;i++){
root=merge(root,tre+i);
}
for(int i=0;i<C;i++){
auto p=split(root,E[i]+1);
auto pp=split(p.first,S[i]);
L[i]=0xE869120;
R[i]=-0xE869120;
vector<int>v;
dfs(L[i],R[i],v,pp.second);
tre[N+i]=treap(L[i],R[i],i);
root=merge(pp.first,merge(tre+N+i,p.second));
for(int j:v){
P[j]=i;
}
}
P[C-1]=C-1;
for(int i=C-1;i>=0;i--){
V[i]=V[P[i]]+(calc(L[i],R[i]-1)<T);
}
pair<int,int>p={0,0};
for(int i=0;i<C-1;i++){
p=max(p,{V[i],-L[i]});
}
return -p.second;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
896 KB |
Output is correct |
2 |
Correct |
1 ms |
896 KB |
Output is correct |
3 |
Correct |
1 ms |
896 KB |
Output is correct |
4 |
Correct |
1 ms |
896 KB |
Output is correct |
5 |
Correct |
1 ms |
896 KB |
Output is correct |
6 |
Correct |
1 ms |
896 KB |
Output is correct |
7 |
Correct |
1 ms |
896 KB |
Output is correct |
8 |
Correct |
1 ms |
896 KB |
Output is correct |
9 |
Correct |
1 ms |
896 KB |
Output is correct |
10 |
Correct |
1 ms |
896 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
896 KB |
Output is correct |
2 |
Correct |
6 ms |
1408 KB |
Output is correct |
3 |
Correct |
2 ms |
1152 KB |
Output is correct |
4 |
Correct |
6 ms |
1536 KB |
Output is correct |
5 |
Correct |
6 ms |
1408 KB |
Output is correct |
6 |
Correct |
5 ms |
1280 KB |
Output is correct |
7 |
Correct |
6 ms |
1408 KB |
Output is correct |
8 |
Correct |
5 ms |
1408 KB |
Output is correct |
9 |
Correct |
3 ms |
1152 KB |
Output is correct |
10 |
Correct |
7 ms |
1536 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
49 ms |
5180 KB |
Output is correct |
2 |
Correct |
115 ms |
13388 KB |
Output is correct |
3 |
Correct |
37 ms |
6648 KB |
Output is correct |
4 |
Correct |
114 ms |
13212 KB |
Output is correct |
5 |
Correct |
110 ms |
12792 KB |
Output is correct |
6 |
Correct |
109 ms |
10744 KB |
Output is correct |
7 |
Correct |
118 ms |
13260 KB |
Output is correct |
8 |
Correct |
117 ms |
13176 KB |
Output is correct |
9 |
Correct |
28 ms |
6144 KB |
Output is correct |
10 |
Correct |
35 ms |
6520 KB |
Output is correct |