Submission #800221

# Submission time Handle Problem Language Result Execution time Memory
800221 2023-08-01T12:21:44 Z jasmin Werewolf (IOI18_werewolf) C++17
0 / 100
267 ms 37852 KB
//#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;

const int INF=1e9+7;

struct node{
    int maxi=0;
    int mini=INF;
};
node none={0, INF};

struct segtree{
    vector<node> tree;

    segtree(int n){
        tree.assign(n*4, none);
    }

    node merge(node a, node b){
        a.maxi = max(a.maxi, b.maxi);
        a.mini = min(a.mini, b.mini);
        return a;
    }

    node update(int l, int r, int v, int x, int val){
        if(x<l || r<=x) return tree[v];
        if(l+1==r){
            return tree[v]={val, val};
        }
        int m=l+(r-l)/2;
        return tree[v] = merge(update(l, m, v*2+1, x, val), update(m, r, v*2+2, x, val));
    }

    node query(int l, int r, int v, int ql, int qr){
        if(qr<=l || r<=ql) return none;
        if(ql<=l && r<=qr){
            return tree[v];
        }
        int m=l+(r-l)/2;
        return merge(query(l, m, v*2+1, ql, qr), query(m, r, v*2+2, ql, qr));
    }
};

bool line_query(int n, segtree& seg, int a, int b, int left, int right){

    int l=a; int r=b;
    int ans=-1;
    while(l<=r){
        int m=l+(r-l)/2;

        if(left <= seg.query(0, n, 0, a, m+1).mini){
            ans = m;
            l = m+1;
        }
        else{
            r=m-1;
        }
    }
    int lastr=ans;

    l=a;  r=b;
    ans=n;
    while(l<=r){
        int m=l+(r-l)/2;

        if(seg.query(0, n, 0, m, b).maxi <= right){
            ans = m;
            r = m-1;
        }
        else{
            l = l+1;
        }
    }
    int lastl=ans;

    return lastl <= lastr;
}

vector<int> solve_line(int n, vector<vector<int> >& adi, vector<int>& s, vector<int>& e,
                        vector<int>& l, vector<int>& r){

    //find line
    vector<int> line;
    int start=0;
    for(int v=0; v<n; v++){

        if(adi[v].size()==1){
            start=v;
        }
    }

    line.push_back(start); 
    int v=adi[start][0]; int p=start;
    for(int i=0; i<n-1; i++){

        line.push_back(v);

        for(auto u: adi[v]){

            if(u!=p){
                v=u;
                break;
            }
        }

        p=v;
    }

    vector<int> ind(n);
    for(int i=0; i<n; i++){
        ind[line[i]]=i;
    }

    //initialize segtree
    segtree seg(n);
    for(int i=0; i<n; i++){

        seg.update(0, n, 0, i, line[i]);
    }


    //answer queries
    int q=s.size();
    vector<int> ans(q);
    for(int i=0; i<q; i++){
        int a=ind[s[i]]; int b=ind[e[i]];

        if(b<a){
            swap(l[i], r[i]);
            swap(a, b);
        }

        ans[i] = line_query(n, seg, a, b, l[i], r[i]);
    }

    return ans;
}

vector<int> check_validity(int n, vector<int> x, vector<int> y,
                                vector<int> s, vector<int> e,
                                vector<int> l, vector<int> r) {

    int m=x.size();

    vector<vector<int> > adi(n);
    for(int i=0; i<m; i++){
        adi[x[i]].push_back(y[i]);
        adi[y[i]].push_back(x[i]);
    }

    return solve_line(n, adi, s, e, l, r);
}
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 267 ms 37852 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -