제출 #827026

#제출 시각아이디문제언어결과실행 시간메모리
827026bachhoangxuan늑대인간 (IOI18_werewolf)C++17
100 / 100
664 ms100632 KiB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
const int maxl=20;
#define pii pair<int,int>
#define piii pair<pii,int>
#define fi first
#define se second

int par[maxn];
int findpar(int u){
    if(u!=par[u]) return par[u]=findpar(par[u]);
    return u;
}

struct Tree{
    vector<int> edge[maxn];
    int n,L[maxn],R[maxn],num,p[maxn][maxl];
    void add(int u,int v){
        par[v]=p[v][0]=u;
        edge[u].push_back(v);
    }
    void dfs(int u){
        L[u]=++num;
        for(int i=1;i<18;i++) p[u][i]=p[p[u][i-1]][i-1];
        for(int v:edge[u]) dfs(v);
        R[u]=num;
    }
    void build(vector<pii> e,int root){
        for(int i=1;i<=n;i++) par[i]=i;
        for(auto &[u,v]:e){
            u=findpar(u);v=findpar(v);
            if(u!=v) add(u,v);
        }
        dfs(root);
    }
    int get(int u,int l,int r){
        for(int i=17;i>=0;i--) if(p[u][i]>=l && p[u][i]<=r) u=p[u][i];
        return u;
    }
}T1,T2;

namespace BIT{
    int n,bit[maxn];
    void update(int x){
        for(int i=x;i<=n;i+=(i&(-i))) bit[i]++;
    }
    int query(int x){
        int res=0;
        for(int i=x;i>=1;i-=(i&(-i))) res+=bit[i];
        return res;
    }
}

vector<int> check_validity(int N, vector<int> U, vector<int> V,
                                vector<int> s, vector<int> t,
                                vector<int> l, vector<int> r) {
    int m=(int)U.size();
    T1.n=T2.n=BIT::n=N;

    vector<pii> e;
    for(int i=0;i<m;i++){
        U[i]++;V[i]++;
        if(U[i]>V[i]) swap(U[i],V[i]);
        e.push_back({U[i],V[i]});
    }
    sort(e.begin(),e.end(),greater<pii>());
    T1.build(e,1);

    e.clear();
    for(int i=0;i<m;i++) e.push_back({V[i],U[i]});
    sort(e.begin(),e.end());
    T2.build(e,N);

    int q=(int)s.size();
    vector<int> ans(q);
    vector<piii> query;
    for(int i=1;i<=N;i++) query.push_back({{T1.L[i],T2.L[i]},-q-1});
    for(int i=0;i<q;i++){
        s[i]++;t[i]++;l[i]++;r[i]++;
        s[i]=T1.get(s[i],l[i],N);
        t[i]=T2.get(t[i],1,r[i]);
        query.push_back({{T1.R[s[i]],T2.R[t[i]]},i+1});
        query.push_back({{T1.L[s[i]]-1,T2.R[t[i]]},-i-1});
        query.push_back({{T1.R[s[i]],T2.L[t[i]]-1},-i-1});
        query.push_back({{T1.L[s[i]]-1,T2.L[t[i]]-1},i+1});
    }
    sort(query.begin(),query.end());
    for(auto &[d,id]:query){
        if(id==-q-1) BIT::update(d.se);
        else ans[abs(id)-1]+=(id<0?-1:1)*BIT::query(d.se);
    }

    for(int i=0;i<q;i++) ans[i]=(ans[i]>=1);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...