답안 #569530

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
569530 2022-05-27T13:21:46 Z NemanjaSo2005 늑대인간 (IOI18_werewolf) C++14
15 / 100
4000 ms 35460 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==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==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:152:1: warning: control reaches end of non-void function [-Wreturn-type]
  152 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 5016 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4980 KB Output is correct
9 Correct 3 ms 4960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 5016 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4980 KB Output is correct
9 Correct 3 ms 4960 KB Output is correct
10 Correct 309 ms 5452 KB Output is correct
11 Correct 164 ms 5404 KB Output is correct
12 Correct 22 ms 5588 KB Output is correct
13 Correct 328 ms 5444 KB Output is correct
14 Correct 199 ms 5332 KB Output is correct
15 Correct 275 ms 5580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4097 ms 35460 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4948 KB Output is correct
2 Correct 4 ms 4948 KB Output is correct
3 Correct 3 ms 5016 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Correct 3 ms 4948 KB Output is correct
8 Correct 3 ms 4980 KB Output is correct
9 Correct 3 ms 4960 KB Output is correct
10 Correct 309 ms 5452 KB Output is correct
11 Correct 164 ms 5404 KB Output is correct
12 Correct 22 ms 5588 KB Output is correct
13 Correct 328 ms 5444 KB Output is correct
14 Correct 199 ms 5332 KB Output is correct
15 Correct 275 ms 5580 KB Output is correct
16 Execution timed out 4097 ms 35460 KB Time limit exceeded
17 Halted 0 ms 0 KB -