Submission #302856

#TimeUsernameProblemLanguageResultExecution timeMemory
302856Pajaraja늑대인간 (IOI18_werewolf)C++17
0 / 100
1603 ms274504 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
#define MAXN 200007
using namespace std;
int uor[MAXN],seg[25][4*MAXN],dsu[2*MAXN],t,pr[MAXN],l[2*MAXN],r[2*MAXN],sz[2*MAXN],n,pk[MAXN],br;
vector<int> g[MAXN],gg[2*MAXN],gd[2*MAXN],s[MAXN],e[MAXN],q[3*MAXN],A,vk[2*MAXN];
void upd(int k,int l,int r,int v,int val,int ind)
{
    if(l==r) {seg[k][ind]+=val; return;}
    int s=(l+r)/2;
    if(v<=s) upd(k,l,s,v,val,2*ind);
    else upd(k,s+1,r,v,val,2*ind+1);
    seg[k][ind]+=val;
}
int query(int k,int l,int r,int lt,int rt,int ind)
{
    if(l>=lt && r<=rt) return seg[k][ind];
    if(r<lt || l>rt) return 0;
    int s=(l+r)/2;
    return query(k,l,s,lt,rt,2*ind)+query(k,s+1,r,lt,rt,2*ind+1);
}
int root(int u)
{
    while(dsu[u]!=u)
    {
        dsu[u]=dsu[dsu[u]];
        u=dsu[u];
    }
    return u;
}
void connect(int u,int v,int trg)
{
    int a=root(u),b=root(v);
    if(a==b) return;
    dsu[a]=dsu[b]=dsu[t]=t;
    if(trg==1) gd[t].push_back(a);
    else gg[t].push_back(a);
    if(trg==1) gd[t].push_back(b);
    else gg[t].push_back(b);
    t++;
}
void dfsg(int s)
{
    l[s]=br;
    for(int i=0;i<gg[s].size();i++) dfsg(gg[s][i]);
    r[s]=br;
    if(gg[s].size()==0) uor[s]=br++;
}
void dfssz(int s)
{
    for(int i=0;i<gd[s].size();i++) dfssz(gd[s][i]);
    for(int i=0;i<gd[s].size();i++) sz[s]+=sz[gd[s][i]];
    if(gd[s].size()==0) sz[s]=1;
}
bool cmp(int a,int b) {return sz[a]>sz[b];}
void dfsd(int s,int ind)
{
    sort(gd[s].begin(),gd[s].end(),cmp);
    if(gd[s].size()!=0) {dfsd(gd[s][0],ind); pk[s]=pk[gd[s][0]];}
    else {pk[s]=s; vk[s].push_back(s); upd(ind,0,n-1,uor[s],1,1);}
    for(int i=1;i<gd[s].size();i++)
    {
        dfsd(gd[s][i],ind+1);
        for(int j=0;j<vk[pk[gd[s][i]]].size();j++) {vk[pk[s]].push_back(vk[pk[gd[s][i]]][j]); upd(ind,0,n-1,uor[vk[pk[gd[s][i]]][j]],1,1); upd(ind+1,0,n-1,uor[vk[pk[gd[s][i]]][j]],-1,1);}
    }
    for(int i=0;i<q[s].size();i++) A[q[s][i]]=(query(ind,0,n-1,l[pr[q[s][i]]],r[pr[q[s][i]]],1)>0)?1:0;
}
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) {
    int Q = S.size(); n=N;
    for(int i=0;i<Q;i++) A.push_back(0);
    for(int i=0;i<X.size();i++) g[X[i]].push_back(Y[i]);
    for(int i=0;i<X.size();i++) g[Y[i]].push_back(X[i]);
    for(int i=0;i<Q;i++) e[R[i]].push_back(i);
    for(int i=0;i<Q;i++) s[L[i]].push_back(i);
    for(int i=0;i<N;i++) dsu[i]=i;
    t=N;
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<g[i].size();j++) if(i>g[i][j]) connect(i,g[i][j],1);
        for(int j=0;j<e[i].size();j++) q[root(E[e[i][j]])].push_back(e[i][j]);
    }
    for(int i=0;i<N;i++) dsu[i]=i;
    t=N;
    for(int i=N-1;i>=0;i--)
    {
        for(int j=0;j<g[i].size();j++) if(i<g[i][j]) connect(i,g[i][j],2);
        for(int j=0;j<s[i].size();j++) pr[s[i][j]]=root(S[s[i][j]]);
    }
    dfsg(2*N-2);
    dfssz(2*N-2);
    dfsd(2*N-2,0);
    return A;
}

Compilation message (stderr)

werewolf.cpp: In function 'void dfsg(int)':
werewolf.cpp:45:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |     for(int i=0;i<gg[s].size();i++) dfsg(gg[s][i]);
      |                 ~^~~~~~~~~~~~~
werewolf.cpp: In function 'void dfssz(int)':
werewolf.cpp:51:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     for(int i=0;i<gd[s].size();i++) dfssz(gd[s][i]);
      |                 ~^~~~~~~~~~~~~
werewolf.cpp:52:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     for(int i=0;i<gd[s].size();i++) sz[s]+=sz[gd[s][i]];
      |                 ~^~~~~~~~~~~~~
werewolf.cpp: In function 'void dfsd(int, int)':
werewolf.cpp:61:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |     for(int i=1;i<gd[s].size();i++)
      |                 ~^~~~~~~~~~~~~
werewolf.cpp:64:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |         for(int j=0;j<vk[pk[gd[s][i]]].size();j++) {vk[pk[s]].push_back(vk[pk[gd[s][i]]][j]); upd(ind,0,n-1,uor[vk[pk[gd[s][i]]][j]],1,1); upd(ind+1,0,n-1,uor[vk[pk[gd[s][i]]][j]],-1,1);}
      |                     ~^~~~~~~~~~~~~~~~~~~~~~~~
werewolf.cpp:66:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |     for(int i=0;i<q[s].size();i++) A[q[s][i]]=(query(ind,0,n-1,l[pr[q[s][i]]],r[pr[q[s][i]]],1)>0)?1:0;
      |                 ~^~~~~~~~~~~~
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:73:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for(int i=0;i<X.size();i++) g[X[i]].push_back(Y[i]);
      |                 ~^~~~~~~~~
werewolf.cpp:74:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |     for(int i=0;i<X.size();i++) g[Y[i]].push_back(X[i]);
      |                 ~^~~~~~~~~
werewolf.cpp:81:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |         for(int j=0;j<g[i].size();j++) if(i>g[i][j]) connect(i,g[i][j],1);
      |                     ~^~~~~~~~~~~~
werewolf.cpp:82:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |         for(int j=0;j<e[i].size();j++) q[root(E[e[i][j]])].push_back(e[i][j]);
      |                     ~^~~~~~~~~~~~
werewolf.cpp:88:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |         for(int j=0;j<g[i].size();j++) if(i<g[i][j]) connect(i,g[i][j],2);
      |                     ~^~~~~~~~~~~~
werewolf.cpp:89:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |         for(int j=0;j<s[i].size();j++) pr[s[i][j]]=root(S[s[i][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...