Submission #1332693

#TimeUsernameProblemLanguageResultExecution timeMemory
1332693WarinchaiWerewolf (IOI18_werewolf)C++20
100 / 100
391 ms140952 KiB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;

int n;

struct qr{
    int s,e,l,r,id;
    qr(int _s,int _e,int _l,int _r,int _id){
        s=_s,e=_e,l=_l,r=_r,id=_id;
    }
};

struct dsu{
    int p[400005];
    int in[400005];
    int out[400005];
    int cur=0;
    int tme=0;
    vector<int>adj[400005];
    void init(int n){
        for(int i=1;i<=2*n;i++)p[i]=i;
        cur=n;
    }
    int fp(int a){
        if(p[a]==a)return a;
        return p[a]=fp(p[a]);
    }
    void un(int a,int b){
        a=fp(a),b=fp(b);
        if(a==b)return;
        cur++;
        p[a]=cur;
        p[b]=cur;
        adj[cur].push_back(a);
        adj[cur].push_back(b);
    }
    void dfs(int u){
        in[u]=++tme;
        for(auto x:adj[u])dfs(x);
        out[u]=tme;
    }
}pre,suf;

vector<pair<int,int>>pe[400005];
vector<pair<int,int>>se[400005];
int pqid[400005];
int sqid[400005];
int pl[400005];
int pr[400005];
int sl[400005];
int sr[400005];
vector<qr>pq[400005],sq[400005];
vector<int>pp[400005];
vector<pair<pair<int,int>,int>>add[400005];
vector<pair<pair<int,int>,int>>del[400005];

struct fenwick{
    int info[400005];
    void upd(int id,int val){
        if(id==0)return;
        for(int i=id;i<=2*n;i+=i&-i)info[i]+=val;
    }
    int fans(int id){
        int ans=0;
        for(int i=id;i>0;i-=i&-i)ans+=info[i];
        return ans;
    }
}fw;

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
    n=N;
    int Q = S.size();
    int M= X.size();
    vector<int> ans(Q);
    for(int i=0;i<M;i++){
        X[i]++,Y[i]++;
        if(X[i]<Y[i])swap(X[i],Y[i]);
        pe[X[i]].push_back({X[i],Y[i]});
        se[Y[i]].push_back({X[i],Y[i]});
    }
    for(int i=0;i<Q;i++){
        S[i]++,E[i]++,L[i]++,R[i]++;
        auto temp=qr(S[i],E[i],L[i],R[i],i);
        sq[L[i]].push_back(temp);
        pq[R[i]].push_back(temp);
    }
    pre.init(N);
    suf.init(N);
    for(int i=1;i<=N;i++){
        for(auto x:pe[i])pre.un(x.first,x.second);
        for(auto x:pq[i])pqid[x.id]=pre.fp(x.e);
    }
    for(int i=N;i>=1;i--){
        for(auto x:se[i])suf.un(x.first,x.second);
        for(auto x:sq[i])sqid[x.id]=suf.fp(x.s);
    }
    pre.dfs(pre.fp(1));
    suf.dfs(suf.fp(1));
    for(int i=0;i<Q;i++){
        pl[i]=pre.in[pqid[i]];
        pr[i]=pre.out[pqid[i]];
        sl[i]=suf.in[sqid[i]];
        sr[i]=suf.out[sqid[i]];
        //cerr<<"i:"<<i<<" "<<pl[i]<<" "<<pr[i]<<" "<<sl[i]<<" "<<sr[i]<<'\n';
        del[pl[i]-1].push_back({{sl[i],sr[i]},i});
        add[pr[i]].push_back({{sl[i],sr[i]},i});
    }
    for(int i=1;i<=N;i++){
        int x=pre.in[i];
        int y=suf.in[i];
        //cerr<<"coord:"<<i<<' '<<x<<" "<<y<<"\n";
        pp[x].push_back(y);
    }
    for(int i=1;i<=2*N;i++){
        for(auto x:pp[i])fw.upd(x,1);
        for(auto [x,id]:del[i])ans[id]-=fw.fans(x.second)-fw.fans(x.first-1);
        for(auto [x,id]:add[i])ans[id]+=fw.fans(x.second)-fw.fans(x.first-1);
    }
    for(auto &x:ans)x=(x>0);
    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...