Submission #580800

# Submission time Handle Problem Language Result Execution time Memory
580800 2022-06-21T20:55:39 Z definitelynotmee Werewolf (IOI18_werewolf) C++17
7 / 100
4000 ms 524288 KB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
template<typename T>
using matrix = vector<vector<T>>;

std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
    
    matrix<int> g(N);
    for(int i = 0; i < X.size(); i++){
        g[X[i]].push_back(Y[i]);
        g[Y[i]].push_back(X[i]);
    }
    int Q = S.size();
    std::vector<int> ans(Q);
    
    if(N <= 1000){
        
        vector<int> c1(N), c2(N);
        auto dfs =[&](int id, int l, int r,vector<int>&check, auto dfs)->void{
            check[id] = 1;
            for(int i : g[id]){
                if(check[i] || i > r || i < l)
                    continue;
                dfs(i,l,r,check,dfs);
            }
        };

        for(int i = 0; i < Q; i++){
            fill(all(c1),0);
            fill(all(c2),0);
            dfs(S[i],L[i],N,c1,dfs);
            dfs(E[i],0,R[i],c2,dfs);
            for(int j = 0; j < N; j++){
                ans[i]|=c1[j]&&c2[j];
            }
        }
    } else {
        vector<int> v;
        v.reserve(N);
        auto dfs =[&](int id, int last, auto dfs)->void{
            for(int i : g[id])
                if(i != last) dfs(i,id,dfs);
            v.push_back(id);
        };
        for(int i = 0; i < N; i++){
            if(g[i].size() == 1){
                dfs(i,-1,dfs);
                break;
            }
        }
        vector<int> inv(N);
        for(int i = 0; i < N; i++)
            inv[v[i]] = i;
        
        matrix<int> smin(20,vector<int>(N)), smax(20,vector<int>(N));
        for(int i = 0; i < N; i++)
            smin[0][i] = v[i], smax[0][i] = v[i];
        
        for(int i = 1; i < 20; i++){
            for(int j = 0; j+(1<<i) <= N; i++){
                smin[i][j] = min(smin[i-1][j],smin[i-1][j+(1<<i-1)]);
                smax[i][j] = max(smax[i-1][j],smax[i-1][j+(1<<i-1)]);
            }
        }

        auto qmin =[&](int l, int r){
            int logg = log2(r-l+1);
            return min(smin[logg][l],smin[logg][r-(1<<logg)+1]);
        };
        auto qmax =[&](int l, int r){
            int logg = log2(r-l+1);
            return max(smax[logg][l],smax[logg][r-(1<<logg)+1]);
        };

        for(int i = 0; i < Q; i++){
            int a = inv[S[i]], b = inv[E[i]];
            if(a < b){
                int ini = a, fim = b;
                while(ini!=fim){
                    int m = (ini+fim+1)>>1;
                    if(qmin(a,m) >= L[i])
                        ini = m;
                    else fim = m-1;
                }
                ans[i] = qmax(ini,b) <= R[i];
            } else {
                int ini = a, fim = b;
                while(ini!=fim){
                    int m = (ini+fim)>>1;
                    if(qmin(m,a) >= L[i])
                        fim = m;
                    else ini = m+1;
                }
                ans[i] = qmax(b,ini) <= R[i];
            }
        }
    }
    
    return ans;
}

Compilation message

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:18:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |     for(int i = 0; i < X.size(); i++){
      |                    ~~^~~~~~~~~~
werewolf.cpp:70:64: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   70 |                 smin[i][j] = min(smin[i-1][j],smin[i-1][j+(1<<i-1)]);
      |                                                               ~^~
werewolf.cpp:71:64: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   71 |                 smax[i][j] = max(smax[i-1][j],smax[i-1][j+(1<<i-1)]);
      |                                                               ~^~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 308 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 308 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Runtime error 442 ms 524288 KB Execution killed with signal 9
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 4078 ms 62012 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 308 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Runtime error 442 ms 524288 KB Execution killed with signal 9
11 Halted 0 ms 0 KB -