답안 #569550

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
569550 2022-05-27T13:42:19 Z NemanjaSo2005 늑대인간 (IOI18_werewolf) C++14
15 / 100
4000 ms 35448 KB
#include "werewolf.h"
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll N,M,K,Q,prosli[200005],pos[200005],pvred,mesto[200005],niz[200005],stmax[525000],stmin[525000];
vector<int> graf[200005],ret;
struct kveri{
   int poc,kraj,id;
   ll L,R;
} upiti[200005];
void dfs2(int gde,int dub){
   prosli[gde]=pvred;
   mesto[gde]=dub;
   niz[dub]=gde;
   for(int i=0;i<graf[gde].size();i++)
      if(prosli[graf[gde][i]]!=pvred)
         dfs2(graf[gde][i],dub+1);
   return;
}
void dfs(int gde,int L,int R){
   prosli[gde]=pvred;
   pos[gde]++;
   for(int i=0;i<graf[gde].size();i++){
      if(prosli[graf[gde][i]]==pvred)
         continue;
      if(graf[gde][i]<L)
         continue;
      if(graf[gde][i]>R)
         continue;
      dfs(graf[gde][i],L,R);
   }
}
ll getmax(int gde,int lg,int dg,int lc,int dc){
   if(lg>dg)
      swap(lg,dg);
   if(lg==lc and dg==dc)
      return stmax[gde];
   int sred=(lc+dc)/2;
   if(dg<=sred)
      return getmax(gde*2,lg,dg,lc,sred);
   if(lg>sred)
      return getmax(gde*2+1,lg,dg,sred+1,dc);
   return max(getmax(gde*2,lg,sred,lc,sred),getmax(gde*2+1,sred+1,dg,sred+1,dc));
}
ll getmin(int gde,int lg,int dg,int lc,int dc){
   if(lg>dg)
      swap(lg,dg);
   if(lg==lc and dg==dc)
      return stmin[gde];
   int sred=(lc+dc)/2;
   if(dg<=sred)
      return getmin(gde*2,lg,dg,lc,sred);
   if(lg>sred)
      return getmin(gde*2+1,lg,dg,sred+1,dc);
   return min(getmin(gde*2,lg,sred,lc,sred),getmin(gde*2+1,sred+1,dg,sred+1,dc));
}
vector<int> check_validity(int NN, vector<int> X, vector<int> Y,vector<int> S, vector<int> E,vector<int> L, vector<int> R) {
   N=NN;
   M=X.size();
   Q=L.size();
   ret.resize(Q);
   for(int i=0;i<M;i++){
      X[i]++;
      Y[i]++;
      graf[X[i]].push_back(Y[i]);
      graf[Y[i]].push_back(X[i]);
   }
   for(int i=0;i<Q;i++){
      S[i]++;
      E[i]++;
      L[i]++;
      R[i]++;
      upiti[i+1].id=i;
      upiti[i+1].poc=S[i];
      upiti[i+1].kraj=E[i];
      upiti[i+1].L=L[i];
      upiti[i+1].R=R[i];
   }
   if(N*Q<=10000000){
      for(int j=1;j<=Q;j++){
         for(int i=1;i<=N;i++)
            pos[i]=0;
         pvred++;
         dfs(upiti[j].poc,upiti[j].L,N);
         pvred++;
         dfs(upiti[j].kraj,1,upiti[j].R);
         ret[upiti[j].id]=0;
         for(int i=1;i<=N;i++)
            if(pos[i]==2)
               ret[upiti[j].id]=1;
      }
      return ret;
   }
   if(N==M+1){
      for(int i=1;i<=N;i++)
         if(graf[i].size()==1){
            dfs2(i,1);
            break;
         }
      K=1;
      while(K<N)
         K<<=1;
      for(int i=1;i<=N;i++)
         stmin[i+K-1]=stmax[i+K-1]=niz[i];
      for(int i=N+K;i<=K+K;i++)
         stmin[i]=1e9;
      for(int i=K-1;i>=1;i--){
         stmax[i]=max(stmax[i*2],stmax[i*2+1]);
         stmin[i]=min(stmin[i*2],stmin[i*2+1]);
      }
      ll lg,dg,sred,v,m;
      for(int j=1;j<=Q;j++){
         lg=mesto[upiti[j].poc];
         dg=mesto[upiti[j].kraj];
         if(lg==dg){
            ret[upiti[j].id]=1;
            continue;
         }
         if(lg<dg){
            while(lg<=dg){
               sred=(lg+dg)/2;
               v=getmax(1,mesto[upiti[j].poc],sred,1,K);
               m=getmin(1,sred,mesto[upiti[j].kraj],1,K);
               if(v>=upiti[j].L and m<=upiti[j].R){
                  ret[upiti[j].id]=1;
                  break;
               }
               if(v<upiti[j].L and m>upiti[j].R)
                  break;
               if(v>=upiti[j].L)
                  lg=sred+1;
               else
                  dg=sred-1;
            }
            continue;
         }
         swap(lg,dg);
         while(lg<=dg){
            sred=(lg+dg)/2;
            v=getmax(1,sred,mesto[upiti[j].poc],1,K);
            m=getmin(1,mesto[upiti[j].kraj],sred,1,K);
            if(v>=upiti[j].L and m<=upiti[j].R){
               ret[upiti[j].id]=1;
               break;
            }
            if(v<upiti[j].L and m>upiti[j].R)
               break;
            if(v>=upiti[j].L)
               lg=sred+1;
            else
               dg=sred-1;
         }
      }
      return ret;
   }
}

Compilation message

werewolf.cpp: In function 'void dfs2(int, int)':
werewolf.cpp:15:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |    for(int i=0;i<graf[gde].size();i++)
      |                ~^~~~~~~~~~~~~~~~~
werewolf.cpp: In function 'void dfs(int, int, int)':
werewolf.cpp:23:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |    for(int i=0;i<graf[gde].size();i++){
      |                ~^~~~~~~~~~~~~~~~~
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:156:1: warning: control reaches end of non-void function [-Wreturn-type]
  156 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 5 ms 4948 KB Output is correct
6 Correct 4 ms 5044 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 5 ms 4948 KB Output is correct
6 Correct 4 ms 5044 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 283 ms 5456 KB Output is correct
11 Correct 177 ms 5396 KB Output is correct
12 Correct 21 ms 5592 KB Output is correct
13 Correct 319 ms 5524 KB Output is correct
14 Correct 211 ms 5408 KB Output is correct
15 Correct 246 ms 5580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4073 ms 35448 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 5 ms 4948 KB Output is correct
6 Correct 4 ms 5044 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 283 ms 5456 KB Output is correct
11 Correct 177 ms 5396 KB Output is correct
12 Correct 21 ms 5592 KB Output is correct
13 Correct 319 ms 5524 KB Output is correct
14 Correct 211 ms 5408 KB Output is correct
15 Correct 246 ms 5580 KB Output is correct
16 Execution timed out 4073 ms 35448 KB Time limit exceeded
17 Halted 0 ms 0 KB -