Submission #1070824

#TimeUsernameProblemLanguageResultExecution timeMemory
1070824ASN49KFloppy (RMI20_floppy)C++14
100 / 100
71 ms16468 KiB
#include <bits/stdc++.h> using namespace std; #include "floppy.h" const int UNSET=-1; const int N=40'000; const int LG=15; int tt[LG+1][N],h[N]; int tin[N],tout[N]; int aux1,aux2; void build(int n) { for(int i=1;i<=LG;i++) { for(int j=0;j<n;j++) { tt[i][j]=tt[i-1][tt[i-1][j]]; } } } bool is_parent(int x,int y) { return (tin[x]<=tin[y] && tout[y]<=tout[x]); } int lca(int x,int y) { if(is_parent(x,y))return x; if(is_parent(y,x))return y; for(int i=LG;i>=0;i--) { if(!is_parent(tt[i][x] , y)) { x=tt[i][x]; } } return tt[0][x]; } void dfs(int nod,vector<int>&l,vector<int>&r,string& rez) { aux1++; if(l[nod]!=UNSET) { rez[aux1<<1]='1'; } if(r[nod]!=UNSET) { rez[aux1<<1|1]='1'; } if(l[nod]!=UNSET) { dfs(l[nod] , l , r ,rez); } if(r[nod]!=UNSET) { dfs(r[nod] , l , r ,rez); } } void read_array(int subtask_id, const std::vector<int> &v) { aux1=-1; int n=(int)v.size(); string rez(2*n , '0'); vector<int>l(n,UNSET),r(n,UNSET); stack<int>sk; for(int i=0;i<n;i++) { while(sk.size() && v[sk.top()]<v[i]) { l[i]=sk.top(); sk.pop(); } sk.push(i); } while(sk.size()) { sk.pop(); } for(int i=n-1;i>=0;i--) { while(sk.size() && v[sk.top()]<v[i]) { r[i]=sk.top(); sk.pop(); } sk.push(i); } dfs(max_element(v.begin() , v.end()) - v.begin(),l,r,rez); save_to_floppy(rez); } int dfs2(const string& bits) { int tinn=++aux1,l=UNSET,r=UNSET; if(bits[tinn<<1]=='1') { l=dfs2(bits); } int nod=++aux2; tin[nod]=tinn; if(bits[tinn<<1|1]=='1') { r=dfs2(bits); } tout[nod]=aux1; if(l!=UNSET) { tt[0][l]=nod; } if(r!=UNSET) { tt[0][r]=nod; } return nod; } std::vector<int> solve_queries(int subtask_id, int n, const std::string &bits, const std::vector<int> &a, const std::vector<int> &b){ int q=(int)a.size(); aux1=aux2=-1; const int root=dfs2(bits); tt[0][root]=root; build(n); vector<int>answers(q); for(int i=0;i<q;i++) { answers[i]=lca(a[i] , b[i]); } return answers; }

Compilation message (stderr)

stub.cpp: In function 'void run2()':
stub.cpp:101:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  101 |     if (query_answers.size() != M) {
      |         ~~~~~~~~~~~~~~~~~~~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...