Submission #185429

#TimeUsernameProblemLanguageResultExecution timeMemory
185429alexandra_udristoiuWerewolf (IOI18_werewolf)C++14
34 / 100
818 ms524288 KiB
#include<fstream>
#include<vector>
#include<algorithm>
#include<cstring>
#include "werewolf.h"
#define DIM 200005
#define f first
#define s second
using namespace std;
static int n, q, nr;
static int t[DIM], aint[4 * DIM], d[DIM];
static pair<int, int> p[2][DIM];
static vector<int> v[DIM], vt[2][DIM], sol;
struct str{
    int ind, x, y, st, dr, p1, u1, p2, u2;
};
static str w[DIM];
int cmp1(str a, str b){
    return a.st > b.st;
}
int cmp2(str a, str b){
    return a.dr < b.dr;
}
int cmp3(str a, str b){
    return a.p1 > b.p1;
}
int rad(int x){
    int y, aux;
    y = x;
    while(t[y] != 0){
        y = t[y];
    }
    while(t[x] != 0){
        aux = t[x];
        t[x] = y;
        x = aux;
    }
    return y;
}
void update(int nod, int st, int dr, int p, int val){
    if(st == dr){
        aint[nod] = val;
    }
    else{
        int mid = (st + dr) / 2;
        if(p <= mid){
            update(2 * nod, st, mid, p, val);
        }
        else{
            update(2 * nod + 1, mid + 1, dr, p, val);
        }
        aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
    }
}
int query(int nod, int st, int dr, int p, int u){
    if(p <= st && dr <= u){
        return aint[nod];
    }
    else{
        int mid = (st + dr) / 2;
        int x, y;
        x = y = n + 1;
        if(p <= mid){
            x = query(2 * nod, st, mid, p, u);
        }
        if(u > mid){
            y = query(2 * nod + 1, mid + 1, dr, p, u);
        }
        return min(x, y);
    }
}
void dfs(int nod, int ind){
    p[ind][nod].f = ++nr;
    for(int i = 0; i < vt[ind][nod].size(); i++){
        dfs(vt[ind][nod][i], ind);
    }
    p[ind][nod].s = nr;
}
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 i, j, nod, u, r;
    n = N;
    q = S.size();
    sol.resize(q);
    for(i = 0; i < n - 1; i++){
        X[i]++; Y[i]++;
        v[ X[i] ].push_back(Y[i]);
        v[ Y[i] ].push_back(X[i]);
    }
    for(i = 0; i < q; i++){
        w[i + 1] = {i, S[i] + 1, E[i] + 1, L[i] + 1, R[i] + 1, 0, 0, 0, 0};
    }
    sort(w + 1, w + q + 1, cmp1);
    u = 1;
    for(i = n; i >= 1; i--){
        for(j = 0; j < v[i].size(); j++){
            nod = v[i][j];
            r = rad(nod);
            if(nod > i && r != i){
                t[r] = i;
                vt[0][i].push_back(r);
            }
        }
        while(w[u].st == i){
            w[u].p1 = rad(w[u].x);
            u++;
        }
    }
    memset(t, 0, sizeof(t) );
    sort(w + 1, w + q + 1, cmp2);
    u = 1;
    for(i = 1; i <= n; i++){
        for(j = 0; j < v[i].size(); j++){
            nod = v[i][j];
            r = rad(nod);
            if(nod < i && r != i){
                t[r] = i;
                vt[1][i].push_back(r);
            }
        }
        while(w[u].dr == i){
            w[u].p2 = rad(w[u].y);
            u++;
        }
    }
    dfs(1, 0);
    nr = 0;
    dfs(n, 1);
    for(i = 1; i <= n; i++){
        d[ p[0][i].f ] = i;
    }
    for(i = 1; i <= q; i++){
        nod = w[i].p1;
        w[i].p1 = p[0][nod].f;
        w[i].u1 = p[0][nod].s;
        nod = w[i].p2;
        w[i].p2 = p[1][nod].f;
        w[i].u2 = p[1][nod].s;
    }
    sort(w + 1, w + q + 1, cmp3);
    u = 1;
    for(i = 1; i <= 4 * n; i++){
        aint[i] = n + 1;
    }
    for(i = n; i >= 1; i--){
        update(1, 1, n, p[1][ d[i] ].f, i);
        while(w[u].p1 == i){
            if( query(1, 1, n, w[u].p2, w[u].u2) <= w[u].u1){
                sol[ w[u].ind ] = 1;
            }
            else{
                sol[ w[u].ind ] = 0;
            }
            u++;
        }
    }
    return sol;
}

Compilation message (stderr)

werewolf.cpp: In function 'void dfs(int, int)':
werewolf.cpp:74:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < vt[ind][nod].size(); i++){
                    ~~^~~~~~~~~~~~~~~~~~~~~
werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:95:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j = 0; j < v[i].size(); j++){
                    ~~^~~~~~~~~~~~~
werewolf.cpp:112:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j = 0; j < v[i].size(); j++){
                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...