Submission #1360026

#TimeUsernameProblemLanguageResultExecution timeMemory
1360026cpdreamerObstacles for a Llama (IOI25_obstacles)C++20
0 / 100
282 ms69296 KiB
#include "obstacles.h"
#include<bits/stdc++.h>
using namespace std;
void file() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
}
#define all(v) v.begin(),v.end()
#define pb push_back
#define V vector
#define P pair
#define F first

typedef long long ll;
int mx[(int)2e5+1][20];
int imx[(int)2e5+1][20];
int imn[(int)2e5+1][20];
int mn[(int)2e5+1][20];
int lg[(int)2e5+1];
int t[(int)2e5+1];
int h[(int)2e5+1];
int n,m;
void init(int s) {
    for (int i=0;i<s;i++) {
        mx[i][0]=h[i];
        imx[i][0]=i;
        imn[i][0]=i;
        mn[i][0]=h[i];
    }
    for (int k=1;k<20;k++) {
        for (int i=0;i<s;i++) {
            if (i+(1<<k)<s) {
                mx[i][k]=max(mx[i][k-1],mx[i+(1<<(k-1))][k-1]);
                if (mx[i][k-1]>=mx[i+(1<<(k-1))][k-1]) {
                    imx[i][k]=imx[i][k-1];
                }
                else {
                    imx[i][k]=imx[i+(1<<(k-1))][k-1];
                }
                mn[i][k]=min(mn[i][k-1],mn[i+(1<<(k-1))][k-1]);
                if (mn[i][k-1]<=mn[i+(1<<(k-1))][k-1]) {
                    imn[i][k]=imn[i][k-1];
                }
                else {
                    imn[i][k]=imn[i+(1<<(k-1))][k-1];
                }
            }
        }
    }
}
int qmx(int l,int r) {
    int x=lg[r-l+1];
    return max(mx[l][x],mx[r-(1<<x)+1][x]);
}
int qmn(int l,int r) {
    int x=lg[r-l+1];
    if (mn[l][x]<=mn[r-(1<<x)+1][x]) {
        return imn[l][x];
    }
    return imn[r-(1<<x)+1][x];
}
void initialize(std::vector<int> T, std::vector<int> H) {
    lg[1]=0;
    for (int i=2;i<=(int)2e5;i++) {
        lg[i]=lg[i/2]+1;
    }
    n=(int)T.size();
    m=(int)H.size();
    for (int i=0;i<n;i++) {
        t[i]=T[i];
    }
    for (int i=0;i<m;i++) {
        h[i]=H[i];
    }
    init(m);
}
int find_min(int id) {
    int l=id,r=m-1;
    int ans1=-1;
    while (l<=r) {
        int mid=l+(r-l)/2;
        if (qmx(id,mid)<t[id]) {
            ans1=mid;
            l=mid+1;
        }
        else {
            r=mid-1;
        }
    }
    l=0,r=id;
    int ans2=-1;
    while (l<=r) {
        int mid=l+(r-l)/2;
        if (qmx(mid,id)<t[id]) {
            ans2=mid;
            r=mid-1;
        }
        else {
            l=mid+1;
        }
    }
    return qmn(ans1,ans2);
}
bool check(int i,int l,int r) {
    int x=qmx(l,r);
    if (x<t[i])return true;
    return false;
}
bool can_reach(int L, int R, int S, int D) {
    int p1[n];
    int p2[n];
    p1[0]=find_min(S);
    p2[0]=find_min(D);
    for (int i=1;i<n;i++) {
        p1[i]=find_min(p1[i-1]);
        p2[i]=find_min(p2[i-1]);
    }
    for (int i=0;i<n;i++) {
        if (check(i,p1[i],p2[i]))return true;
    }
    return false;
}

Compilation message (stderr)

obstacles.cpp: In function 'void file()':
obstacles.cpp:5:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    5 |     freopen("input.txt","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
obstacles.cpp:6:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    6 |     freopen("output.txt","w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...