Submission #1056744

#TimeUsernameProblemLanguageResultExecution timeMemory
1056744amirhoseinfar1385Radio Towers (IOI22_towers)C++17
23 / 100
4054 ms29916 KiB
#include "towers.h"
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10,lg=18,kaf=(1<<lg),inf=1e9+5;
int all[maxn];

struct segmentmin{
  pair<long long ,long long>seg[(1<<(lg+1))];
  segmentmin(){
    for(int i=2*kaf-1;i>=0;i--){
      if(i>=kaf){
        seg[i].second=i-kaf;
      }else{
        seg[i].second=seg[(i<<1)].second;
      }
    }
  }
  void ins(int i,int w){
    i+=kaf;
    seg[i].first=w;
    i>>=1;
    while(i>0){
      seg[i]=min(seg[(i<<1)],seg[(i<<1)^1]);
      i>>=1;
    }
  }
  pair<long long ,long long> pors(int i,int l,int r,int tl,int tr){
    if(l>r||l>tr||r<tl||tl>tr){
      return make_pair(inf,inf);
    }
    if(l>=tl&&r<=tr){
      return seg[i];
    }
    int m=(l+r)>>1;
    return min(pors((i<<1),l,m,tl,tr),pors((i<<1)^1,m+1,r,tl,tr));
  }
}segmn;


struct segmentmax{
  pair<long long ,long long>seg[(1<<(lg+1))];
  segmentmax(){
    for(int i=2*kaf-1;i>=0;i--){
      if(i>=kaf){
        seg[i].second=i-kaf;
      }else{
        seg[i].second=seg[(i<<1)].second;
      }
    }
  }
  void ins(int i,int w){
    i+=kaf;
    seg[i].first=w;
    i>>=1;
    while(i>0){
      seg[i]=max(seg[(i<<1)],seg[(i<<1)^1]);
      i>>=1;
    }
  }
  pair<long long ,long long> pors(int i,int l,int r,int tl,int tr){
    if(l>r||l>tr||r<tl||tl>tr){
      return make_pair(0,0);
    }
    if(l>=tl&&r<=tr){
      return seg[i];
    }
    int m=(l+r)>>1;
    return max(pors((i<<1),l,m,tl,tr),pors((i<<1)^1,m+1,r,tl,tr));
  }
}segmx;
int n;

void init(int N, std::vector<int> H) {
  n=N;
  for(int i=0;i<n;i++){
    all[i]=H[i];
    segmx.ins(i,H[i]);
    segmn.ins(i,H[i]);
  }
}

int solve(int l,int r,int d){
  if(l==r){
    return 1;
  }
  int ind=segmx.pors(1,0,kaf-1,l,r).second;
  int cl=0,cr=0,ret=0;
  if(segmn.pors(1,0,kaf-1,l,ind-1).first<=all[ind]-d){
    cl=solve(l,ind-1,d);
  }
  if(segmn.pors(1,0,kaf-1,ind+1,r).first<=all[ind]-d){
    cr=solve(ind+1,r,d);
  }
  ret=cl+cr;
  //cout<<"wtF: "<<l<<" "<<r<<" "<<d<<" "<<cl<<" "<<cr<<endl;
  ret=max(ret,1);
  return ret;
}

int max_towers(int L, int R, int D) {
  return solve(L,R,D);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...