제출 #75012

#제출 시각아이디문제언어결과실행 시간메모리
75012faustaadp늑대인간 (IOI18_werewolf)C++17
49 / 100
3574 ms133980 KiB
#include "werewolf.h"
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
ll i,j,b[202020][2],ux,uy,nx,dep[202020],p[22][202020],mi[22][202020],ma[22][202020],LL,RR,C,bisa,ganti,CC,De[202020];
vector<ll> v[202020];
void dfs(ll aa,ll bb)
{
    dep[aa]=bb;
    ll ii;
    for(ii=0;ii<v[aa].size();ii++)
    {
        if(dep[v[aa][ii]]>0)
            continue;
        else
        {
            p[0][v[aa][ii]]=aa;
            dfs(v[aa][ii],bb+1);
        }
    }
}
ll P(ll aa,ll bb)
{
    ll ii;
    for(ii=20;ii>=0;ii--)
    {
        if(bb>=((1<<ii)))
        {
            aa=p[ii][aa];
            bb-=(1<<ii);
        }
    }
    return aa;
}
ll MI(ll aa,ll bb)
{
    if(dep[aa]<dep[bb])
        swap(aa,bb);
    ll ii,Mi=1e18;
    for(ii=20;ii>=0;ii--)
    {
        if((dep[aa]-(1<<ii))>=(dep[bb]))
        {
            Mi=min(Mi,mi[ii][aa]);
            aa=p[ii][aa];
        }
    }
    if(aa==bb)
        return min(Mi,mi[0][aa]);
    for(ii=20;ii>=0;ii--)
    {
        if(p[ii][aa]!=p[ii][bb])
        {
            Mi=min(Mi,mi[ii][aa]);
            Mi=min(Mi,mi[ii][bb]);
            aa=p[ii][aa];
            bb=p[ii][bb];
        }
    }
    return min(Mi,min(mi[1][aa],mi[1][bb]));
}
ll MA(ll aa,ll bb)
{
    if(dep[aa]<dep[bb])
        swap(aa,bb);
    ll ii,Ma=-1e18;
    for(ii=20;ii>=0;ii--)
    {
        if((dep[aa]-(1<<ii))>=(dep[bb]))
        {
            Ma=max(Ma,ma[ii][aa]);
            aa=p[ii][aa];
        }
    }
    if(aa==bb)
        return max(Ma,ma[0][aa]);
    for(ii=20;ii>=0;ii--)
    {
        if(p[ii][aa]!=p[ii][bb])
        {
            Ma=min(Ma,ma[ii][aa]);
            Ma=min(Ma,ma[ii][bb]);
            aa=p[ii][aa];
            bb=p[ii][bb];
        }
    }
    return max(Ma,max(ma[1][aa],ma[1][bb]));
}
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();
        std::vector<int> A;
      for(i=0;i<X.size();i++)
      {
            v[X[i]].pb(Y[i]);
            v[Y[i]].pb(X[i]);
            De[X[i]]++;
            De[Y[i]]++;
      }
        int M=X.size();
      if(M<=6000&&N<=3000&&Q<=3000)
      {
          for(i=0;i<Q;i++)
          {
                memset(b,0,sizeof(b));
                queue<pair<ll,ll> > q;
                if(S[i]>=L[i]||1)
                {
                    q.push(mp(S[i],0));
                    b[S[i]][0]=1;
                }
                while(!q.empty())
                {
                    ux=q.front().fi;
                    uy=q.front().se;
               //     cout<<ux<<" "<<uy<<"\n";
                    q.pop();
                    for(j=0;j<v[ux].size();j++)
                    {
                        nx=v[ux][j];
                        if((b[nx][uy]==0)&&((uy==0&&nx>=L[i])||(uy==1&&nx<=R[i])))
                        {
                            b[nx][uy]=1;
                            q.push(mp(nx,uy));
                        }
                    }
                    if(L[i]<=ux&&ux<=R[i]&&uy==0)
                    {
                        b[ux][1]=1;
                        q.push(mp(ux,1));
                    }
                }
                A.pb(b[E[i]][1]);
          }
      }
      else
        if(X.size()==N-1)
      {
            ll NOO=0;
            for(i=0;i<N;i++)
                if(De[i]==1)
                    NOO=i;
            p[0][NOO]=NOO;
            dfs(NOO,1);
            for(i=0;i<N;i++)
            {
                mi[0][i]=i;
                ma[0][i]=i;
            }
            for(i=1;i<=20;i++)
                for(j=0;j<N;j++)
                {
                    p[i][j]=p[i-1][p[i-1][j]];
                    mi[i][j]=min(mi[i-1][j],mi[i-1][p[i-1][j]]);
                    ma[i][j]=max(ma[i-1][j],ma[i-1][p[i-1][j]]);
                }
            /*while(1)
            {
                ll ta,tb;
                cin>>ta>>tb;
                cout<<MI(ta,tb)<<"\n";
            }*/
           // cout<<NOO<<"\n";
            for(i=0;i<Q;i++)
            {
                if(dep[S[i]]>dep[E[i]])
                {
                    ganti=-1;
                    LL=0;
                    RR=dep[S[i]]-dep[E[i]];
                    while(LL<=RR)
                    {
                        C=(LL+RR)/2;
                        CC=P(S[i],C);
                        if((MI(S[i],CC)>=L[i]))
                        {
                            ganti=CC;
                            LL=C+1;
                        }
                        else
                            RR=C-1;
                    }
                    if(ganti!=-1&&(MA(ganti,E[i])<=R[i]))
                    {
                        A.pb(1);
                        continue;
                    }
                }
                else
                {
                    ganti=-1;
                    LL=0;
                    RR=dep[E[i]]-dep[S[i]];
                    while(LL<=RR)
                    {
                        C=(LL+RR)/2;
                        CC=P(E[i],C);
                        if((MA(E[i],CC)<=R[i]))
                        {
                            ganti=CC;
                            LL=C+1;
                        }
                        else
                            RR=C-1;
                    }
                    if(ganti!=-1&&(MI(ganti,S[i])>=L[i]))
                    {
                        A.pb(1);
                        continue;
                    }
                }
                A.pb(0);
            }

      }
      return A;
}

컴파일 시 표준 에러 (stderr) 메시지

werewolf.cpp: In function 'void dfs(long long int, long long int)':
werewolf.cpp:15:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(ii=0;ii<v[aa].size();ii++)
              ~~^~~~~~~~~~~~~
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:99:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(i=0;i<X.size();i++)
               ~^~~~~~~~~
werewolf.cpp:124:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                     for(j=0;j<v[ux].size();j++)
                             ~^~~~~~~~~~~~~
werewolf.cpp:143:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(X.size()==N-1)
            ~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...