Submission #831548

#TimeUsernameProblemLanguageResultExecution timeMemory
831548ALeonidouWerewolf (IOI18_werewolf)C++17
34 / 100
1188 ms55744 KiB
#include "werewolf.h"
#include <bits/stdc++.h>

using namespace std;

#define ll int
#define F first
#define S second
#define sz(x) (ll)x.size()
#define MID ((l+r)/2)
#define pb push_back
#define dbg(x) cout<<#x<<": "<<x<<endl;
#define dbg2(x,y) cout<<#x<<": "<<x<<" "<<#y<<": "<<y<<endl;
#define dbg3(x,y,z) cout<<#x<<": "<<x<<" "<<#y<<": "<<y<<" "<<#z<<": "<<z<<endl;
#define dbg4(x,y,z,w) cout<<#x<<": "<<x<<" "<<#y<<": "<<y<<" "<<#z<<": "<<z<<" "<<#w<<": "<<w<<endl;
#define INF 1e9
typedef vector <ll> vi;
typedef pair<ll,ll> ii;
typedef vector <ii> vii;

void printVct(vi &v, string s =""){
    if (sz(s) > 0) cout<<s<<": ";
    for (ll i=0; i<sz(v); i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}

void tabb(ll n) {
    for (ll i= 0; i<n; i++) cout<<"\t";
}

vector <vi> adj;
ll n,m;
vi arr, inv, vis;

void dfs(ll u){
    vis[u] = 1;
    arr.pb(u);
    for (ll i=0; i<sz(adj[u]); i++){
        if (!vis[adj[u][i]]){
            dfs(adj[u][i]);
        }
    }
}

struct node{
    ll mini, maxi;
    node *L, *R;
    void build (ll l = 0, ll r = n-1){
        // tabb(tab);
        // dbg2(l,r);
        if (l == r){
            mini = arr[l];
            maxi = arr[l];
        } 
        else{
            L = new node;
            R = new node;
            L -> build (l, MID);
            R -> build (MID+1, r);
            mini =min(L->mini, R->mini);
            maxi =max(L->maxi, R->maxi);
        }
        // tabb(tab);
        // dbg2(mini, maxi);
    }

    ll queryMin(ll tl, ll tr, ll l = 0, ll r = n-1){
        if (l >= tl && r <= tr) return mini;
        else if (tl > r || tr < l) return INF;
        return min(L->queryMin(tl,tr,l,MID), R->queryMin(tl,tr,MID+1,r));
    }

    ll queryMax(ll tl, ll tr, ll l = 0, ll r = n-1){
        //dbg4(tl,tr,l,r);
        if (l >= tl && r <= tr) return maxi;
        else if (tl > r || tr < l) return -1;
        return max(L->queryMax(tl,tr,l,MID), R->queryMax(tl,tr,MID+1,r));
    }
};

vi check_validity(int N, vi X, vi Y, vi S, vi E, vi L, vi R){
    m = sz(X),n = N;
    vi deg(n, 0);
    adj.assign(n, vi());
    for (ll i=0;i<m; i++){
        adj[X[i]].pb(Y[i]);
        adj[Y[i]].pb(X[i]);
        deg[X[i]]++;
        deg[Y[i]]++;
    }

    //find start
    ll p = -1;
    for (ll i = 0; i<n; i++){
        if (deg[i] == 1){
            p =i;
            break;
        }
    }
    if (p == -1) return vi();

    //prepare arrays
    arr.clear(), inv.resize(n);
    vis.assign(n, 0);
    dfs(p);
    for (ll i= 0; i<n;i++){
        inv[arr[i]] = i; 
    }
    // printVct(arr, "arr");
    // printVct(inv,"inv");

    //build seg
    node root;
    root.build();

    //solve
    vi ans;
    ll q = sz(L);
    for (ll i=0; i<q; i++){
        ll s = S[i], e= E[i], tl = L[i], tr = R[i];
        ll idxS = inv[s], idxE = inv[e];
        // dbg2(idxS, idxE);

        if (idxS < idxE){
            // cout<<"INININII"<<endl;
            //dbg2(root.queryMin(3, 7), root.queryMax(4, 6));
            
            ll l = idxS, r = idxE, mid;
            ll L_idx = idxS;
            while (l <= r){
                mid = MID;
                // dbg3(l,r,mid);

                bool ok = (root.queryMin(l, mid) >= tl);
                // dbg(root.queryMin(l, mid));

                if (ok){
                    l = mid+1;
                    L_idx = mid;
                }
                else{
                    r = mid-1;
                }
            }

            // dbg(L_idx);

            if (root.queryMax(L_idx, idxE) <= tr){
                ans.pb(1);
                // cout<<"OK"<<endl;
            }
            else{
                ans.pb(0);
                // cout<<"NOT OK"<<endl;
            }
        }
        else{
            ll l = idxE, r = idxS, mid;
            ll R_idx = idxS;
            while (l <= r){
                mid = MID;
                // dbg3(l,r,mid);

                bool ok = (root.queryMin(mid, r) >= tl);
                // dbg(root.queryMin(mid, r));

                if (ok){
                    r = mid-1;
                    R_idx = mid;
                }
                else{
                    l = mid+1;
                }
            }

            // dbg(R_idx);
            // dbg(root.queryMax(idxE, R_idx));
            if (root.queryMax(idxE, R_idx) <= tr){
                ans.pb(1);
                // cout<<"OK"<<endl;
            }
            else{
                ans.pb(0);
                // cout<<"NOT OK"<<endl;
            }
        }
    }
    
    // cout<<endl;
    // printVct(ans, "ans");
    return ans;
}


/*

8 7 1
3 1
1 0
0 6
6 2
2 4
4 5
5 7
3 7 1 7

5 3 1 6



6 6 3
5 1
1 2
1 3
3 4
3 0
5 2
4 2 1 2
4 2 2 2
5 4 3 4

*/

Compilation message (stderr)

werewolf.cpp: In function 'vi check_validity(int, vi, vi, vi, vi, vi, vi)':
werewolf.cpp:115:10: warning: 'root.node::R' may be used uninitialized in this function [-Wmaybe-uninitialized]
  115 |     node root;
      |          ^~~~
werewolf.cpp:115:10: warning: 'root.node::L' may be used uninitialized in this function [-Wmaybe-uninitialized]
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...